2009-04-22 22 views
5

Soy nuevo en WSE y WCF y estoy tratando de consumir un servicio web utilizando WCF, pero toda la documentación de ejemplo es para VS2005 + WSE. Este servicio web usa WS-Security 1.0. He añadido una referencia de servicio a través de Visual Studio, pero estoy en una pérdida sobre cómo hacer el equivalente del código de abajo en WCF:Conversión del código de ejemplo de WSE en WCF

// 1. Initialize the web service proxy 
PartnerAPIWse integrationFramework = new PartnerAPIWse(); 

// 2. Set the username/password. This is using the Username token of WS-Security 1.0 
UsernameTokenProvider utp = new UsernameTokenProvider("username", "password"); 
integrationFramework.SetClientCredential<UsernameToken>(utp.GetToken()); 

// 3. Declare the policy 
Policy policy = new Policy(new UsernameOverTransportAssertion()); 
integrationFramework.SetPolicy(policy); 
+0

Para referencia futura: WSE está obsoleto. Todo el nuevo desarrollo del servicio web debe hacerse usando WCF, y el código WSE debe retirarse lo antes posible. –

+5

Algunas compañías tienen una gran inversión en WSE. No siempre es una decisión comercialmente comercial abandonar una generación de tecnología en particular porque el proveedor ha descubierto algo nuevo. –

+0

Esta pregunta y respuesta son útiles; sin embargo, en algunos casos, el encabezado de seguridad resultante carece de "nonce" y otros elementos/atributos críticos. La siguiente pregunta y respuesta abordan este problema: http://stackoverflow.com/questions/3102693/error-in-wcf-client-consuming-axis-2-web-service-with-ws-security-usernametoken-p – Brett

Respuesta

8

Después de pasar un día haciendo un poco de experimentación me di cuenta de cómo convertir este código . La clave fue configurar los enlaces en el proxy WCF que VS2008 hace correctamente.

  1. Añadir un señalador referencia de servicio para el WSDL
  2. abierto App.config/Web.config y localice la sección system.serviceModel. Cambie el modo de seguridad en el enlace de soap predeterminado para que sea TransportWithMessageCredential. Esto es lo que mi archivo parecía después del cambio:

     <basicHttpBinding> 
         <binding name="SoapBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
          receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" 
          bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
          useDefaultWebProxy="true"> 
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
           maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
          <security mode="TransportWithMessageCredential"> 
           <transport clientCredentialType="None" proxyCredentialType="None" 
            realm="" /> 
           <message clientCredentialType="UserName" algorithmSuite="Default" /> 
          </security> 
         </binding> 
        </basicHttpBinding> 
    
  3. Cambiar el código de ejemplo anterior para que parezca esta

    Dim integrationFramework As New SoapClient() 
    integrationFramework.ClientCredentials.UserName.UserName = "username" 
    integrationFramework.ClientCredentials.UserName.Password = "password" 
    

TransportWithMessageCredential es equivalente a la política UsernameOverTransportAssertion bajo WSE 3.0

Cuestiones relacionadas