2012-03-28 39 views
3

我們需要使用C#/ .Net 4.0應用程序中使用Java開發的SOAP 1.1 Web服務。我們無法訪問服務編程或其駐留的服務器。該服務通過非SSL連接提供,並且需要WS-Security,Username/PasswordText。WCF和SOAP WS-Security的問題PlainText用戶名(無SSL)

使用SoapUI(http://soapui.org/),我們可以簡單地通過創建項目,將其指向WSDL並設置簡單的Username/PasswordText WS-Security配置來使用Web服務。

問題是我們無法使用WCF使用Web服務。經過一番研究,我們發現了一些信息,導致我們認爲這個問題可能是SOAP 1.1,WS-Security和wsHttpBinding之間的不兼容。所使用的C#代碼是下面的:

 //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(); 

的結合創建如下:

  <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> 

由服務引用創建的綁定是basicHttpBinding的。我們知道我們需要爲WS-Security(SOAP 1.2)使用wsHttpBinding,但由於該服務使用SOAP 1.1,所以這兩個似乎不兼容。

應(如SOAPUI產生的)正確的請求消息:

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> 

難道真的沒有辦法做到這一點使用WCF?這可以使用customBinding來解決嗎?我們是否可以選擇手工製作標題/消息並解析響應?我是否必須通過非SSL連接來刺激Web服務開發人員使用帶有SOAP 1.1的WS-Security?

回答

0

看看這可以幫助你(使用的WSHttpBinding,但被告知要SOAP 1.1兼容的請求):

Does WCF support WS-Security with SOAP 1.1?

+0

感謝您的回覆。我在研究時閱讀了這個問題,最受歡迎的回答建議使用「messageVersion = Soap11WSAddressing10」,但問題仍然存在(與所有其他SOAP11 * messageVersions一樣)。問題是生成的SOAP消息不包含必需的Authorization:Basic xxxx標頭。我正在編輯原始消息以包含由SOAPUI生成的正確消息。 – Luis 2012-03-28 19:20:52