2009-04-22 7 views
5

Je suis nouveau à la fois WSE et WCF et j'essaye de consommer un service Web en utilisant WCF mais toute la documentation d'exemple est pour VS2005 + WSE. Ce service Web utilise WS-Security 1.0. J'ai ajouté une référence de service par le studio visuel mais je suis à une perte sur la façon de faire l'équivalent du code ci-dessous dans WCF:Conversion de l'exemple de code 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

Pour référence future: WSE est obsolète. Tout nouveau développement de service Web devrait être fait en utilisant WCF, et le code WSE devrait être retiré ASAP. –

+5

Certaines entreprises ont un énorme investissement dans WSE. Ce n'est pas toujours une décision commercialement valable d'abandonner une génération de technologie particulière parce que le vendeur a mis quelque chose de nouveau. –

+0

Cette question et cette réponse sont utiles. cependant, dans certains cas, l'en-tête de sécurité qui en résulte manque d'un "nonce" et d'autres éléments/attributs critiques. Les questions et réponses suivantes abordent ce problème: http://stackoverflow.com/questions/3102693/error-in-wcf-client-consuming-axis-2-web-service-with-ws-security-usernametoken-p – Brett

Répondre

8

Après avoir passé une journée à faire quelques essais je me suis dit comment convertir ce code . La clé était la configuration des liaisons sur le proxy WCF que VS2008 fait correctement.

  1. Ajouter une référence de service pointant vers le WSDL
  2. Ouvrir App.config/web.config et accédez à la section de system.serviceModel. Changez le mode de sécurité sur la reliure par défaut à être TransportWithMessageCredential. Voici ce que mon dossier ressemblait après le changement:

     <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. Modifier le code exemple ci-dessus pour ressembler à ce

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

TransportWithMessageCredential est équivalent à la politique UsernameOverTransportAssertion sous WSE 3.0