2013-04-28 46 views
1

我正在理解SOAP服務是如何工作的。我的客戶端是使用Java並且服務使用WCF(雖然理論上這應該不重要)。如果我給出一個SOAP信封的例子,請執行以下操作:使用字符串從Java構建SOAP信封

-Build a SOAP envelope that exactly follows the example 
-Use an HttpPost object to post the data to www.service.com/service.svc 

這是一個正確的(雖然不恰當)的方式來調用服務?因爲當我這樣做時,即使我的SOAP信封與示例完全相同,我也會收到400響應。

+0

什麼是WCF服務的綁定,以及您使用哪個版本的SOAP? WCF對SOAP 1.1使用'basicHttpBinding' - 所有其他人(我相信)都是1.2。 – Tim 2013-04-28 05:07:06

+0

我們使用SOAP 1.2,但我不確定我們正在使用的綁定。 BasicHttpBinding是我想要的場景 – anguyen 2013-04-28 05:44:14

+0

經過快速檢查後,配置文件確實指定我們使用basicHttpBinding''protocolMapping>' 或者這不是指定綁定的正確方法嗎? – anguyen 2013-04-28 06:00:21

回答

0

它應該工作。您可能缺少一些必需的標題。我建議使用TCP監視器,截取工作請求並分析其內容。

+0

它是一個HTTP頭?還是一個SOAP頭?在Post中,我只將Content-type指定爲「text/xml」。我對於使用網絡服務相對來說比較陌生,所以我想我不知道我還需要什麼。 – anguyen 2013-04-28 05:40:16

0

我認爲你得到一個HTTP 400(錯誤請求)的原因是你的服務使用的是SOAP 1.1的BasicHttpBinding,而且你最可能發送一個SOAP 1.2消息(正如你在評論中指出的那樣使用SOAP 1.2)。這兩種消息格式不同。

最簡單的解決方案是使用SOAP 1.1,但是如果您必須(或想要)使用SOAP 1.2,以下可能會有所幫助。

在您的配置文件中,您尚未定義任何端點或綁定 - 這是正常的,因爲WCF將在4.0和更高版本中使用默認值。

但是,HTTP的默認綁定是BasicHttpBinding。您需要使用支持SOAP 1.2的綁定(或將您的消息更改爲SOAP 1.1)。您可以使用WSHttpBinding,它支持SOAP 1.2,但是您必須更改安全設置(默認情況下它是Windows)。

另一種選擇是使用實現SOAP1.1的自定義綁定。我會舉幾個例子(我從來沒有寫過一個WCF服務的非.NET客戶端,所以我不能肯定地說它會起作用,但它至少應該讓你進入正確的方向

WsHttpBinding的

變化在你的配置文件重寫協議映射的默認協議映射爲HTTP請求從BasicHttpBindingWsHttpBinding

<protocolMapping> 
    <addBinding protocol="wsHttpBinding" scheme="http" /> 
</protocolMapping> 

向您的配置文件添加綁定部分,以便您可以將安全模式設置爲無。這正好下<system.serviceModel>部分:

<bindings> 
    <wsHttpBinding> 
    <binding> 
     <security mode="None" /> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

注意,我並沒有在綁定的name屬性設置的值。這會將綁定定義設置爲默認值,並且將HTTP的默認協議更改爲wsHttpBinding可使您發送SOAP 1.2。

安全注意事項*如果您只是想更好地瞭解SOAP,那麼將安全設置爲none就沒有問題,但我強烈建議在生產環境中使用它。

自定義綁定

我從來沒有使用自定義綁定,但這樣的事情應該工作:

<bindings> 
    <customBinding> 
    <binding name="Custom"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httTransport /> 
    </binding> 
    </customBinding> 
</bindings> 

您需要明確地將它設置爲您的端點(使用bindingConfiguration屬性),這意味着您需要在配置文件中創建一個端點定義。

自定義綁定的想法是從SOAP 1.2 message format with BasicHttpBinding

希望這會給你一些想法,讓你再次去。