2012-03-28 5 views
3

Wir müssen einen SOAP 1.1-Webdienst verwenden, der mit Java aus einer C#/.Net 4.0-Anwendung entwickelt wurde. Wir haben keinen Zugriff auf die Service-Programmierung oder den Server, auf dem sie sich befindet. Der Dienst ist über eine Nicht-SSL-Verbindung verfügbar und erfordert WS-Sicherheit, Benutzername/PasswortText.Probleme mit WCF und SOAP WS-Sicherheit PlainText Benutzername (kein SSL)

Mit SoapUI (http://soapui.org/) können wir den Web-Service einfach nutzen, indem wir ein Projekt erstellen, auf die WSDL verweisen und eine einfache User/PasswordText WS-Security-Konfiguration einrichten.

Das Problem besteht darin, dass wir den Webdienst mit WCF nicht verwenden können. Nach einigen Recherchen fanden wir Informationen, die uns glauben machen, dass das Problem eine Inkompatibilität zwischen SOAP 1.1, WS-Security und dem wsHttpBinding sein könnte. Der C# -Code verwendet wird, ist die folgende:

 //The WSService.ServiceClient class is generated by the Service Reference 
     var client = new WSService.ServiceClient(); 

     client.ClientCredentials.UserName.UserName = "Username"; 
     client.ClientCredentials.UserName.Password = "Password"; 

     var response = client.MethodToBeConsumed(); 

Die Bindung erstellt ist folgende:

  <binding name="GeneratedBinding" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01: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="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 

Die vom Service-Referenz erstellt Bindung ist ein Basichttpbinding. Wir verstehen, dass wir ein WSHttpBinding für WS-Security (SOAP 1.2) verwenden müssen, aber da das SERVICE SOAP 1.1 verwendet, scheinen diese beiden nicht kompatibel zu sein.

Die richtige Anforderungsnachricht (wie erzeugt durch SOAPUI) werden soll:

POST http://server:port/Service HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: text/xml;charset=UTF-8 
SOAPAction: "" 
Authorization: Basic ENCRYPTEDPASSWORD 
User-Agent: Jakarta Commons-HttpClient/3.1 
Host: server:port 
Content-Length: 324 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:service.version.details"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <urn:methodName> 
     <arg0>1</arg0> 
     <arg1>1</arg1> 
     </urn:method> 
    </soapenv:Body> 
</soapenv:Envelope> 

keine Möglichkeit Gibt es wirklich diese mit WCF zu erreichen? Kann dies mit einem customBinding gelöst werden? Ist unsere einzige verfügbare Wahl, die Header/Nachrichten manuell zu erstellen und die Antworten zu analysieren? Muss ich einen Web-Service-Entwickler für die Verwendung von WS-Security mit SOAP 1.1 über eine nicht-SSL-Verbindung zu ermorden?

Antwort

0

sehen, ob dies hilft Ihnen aus (WSHttpBinding verwendet, aber gesagt, SOAP 1.1-kompatible Anfragen zu machen):

Does WCF support WS-Security with SOAP 1.1?

+0

Vielen Dank für die Antwort. Ich lese diese Frage während der Recherche, die beliebteste Antwort rät zur Verwendung von "messageVersion = Soap11WSAddressing10", aber das Problem bleibt (mit allen anderen SOAP11 * messageVersions auch). Das Problem besteht darin, dass die generierte SOAP-Nachricht nicht den erforderlichen Header Authorization: Basic xxxx enthält. Ich bearbeite die ursprüngliche Nachricht, um die korrekte Nachricht, die von SOAPUI generiert wird, einzuschließen. – Luis