我正在努力理解SOAP服务是如何工作的。我的客户端是Java,服务是使用WCF(虽然理论上这无关紧要)。如果给我一个SOAP信封的示例并执行以下操作:
-Build a SOAP envelope that exactly follows the example
-Use an HttpPost object to post the data to www.service.com/service.svc
这是一种正确(虽然不正确)的方式来调用服务吗?因为当我这样做时,我会收到400响应,即使我的SOAP信封与示例完全相同。
答案 0 :(得分:0)
它应该工作。您可能缺少一些必需的标题。我建议使用TCP监视器,拦截工作请求并分析其内容。
答案 1 :(得分:0)
我认为您获得HTTP 400(错误请求)的原因是您的服务使用的是BasicHttpBinding
,这是SOAP 1.1,并且您很可能发送SOAP 1.2消息(正如您在评论中指出的那样)您正在使用SOAP 1.2)。两者之间的消息格式不同。
最简单的解决方案是使用SOAP 1.1,但如果您必须(或想要)使用SOAP 1.2,则以下内容可能有所帮助。
在您的配置文件中,您尚未定义任何端点或绑定 - 这没关系,因为WCF将使用4.0及更高版本中的默认值。
但是,HTTP的默认绑定是BasicHttpBinding
。您需要使用支持SOAP 1.2的绑定(或将您的消息更改为SOAP 1.1)。您可以使用支持SOAP 1.2的WSHttpBinding
,但是您必须更改安全设置(默认情况下是Windows)。
另一种选择是使用实现SOAP1.1的自定义绑定。
我将举几个例子(我从来没有为WCF服务编写非.NET客户端,所以我不能肯定它会起作用,但它至少应该让你进入正确的方向。
<强> WsHttpBinding的强>
通过覆盖配置文件中的协议映射,将HTTP请求的默认协议映射从BasicHttpBinding
更改为WsHttpBinding
:
<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,那么将安全性设置为无可用,但我强烈建议您在生产中使用它。
自定义绑定
我从未使用自定义绑定,但这样的事情应该有效:
<bindings>
<customBinding>
<binding name="Custom">
<textMessageEncoding messageVersion="Soap12" />
<httTransport />
</binding>
</customBinding>
</bindings>
您需要将此显式设置为您的端点(使用端点的bindingConfiguration
属性),这意味着您需要在配置文件中创建端点定义。
自定义绑定提示来自SOAP 1.2 message format with BasicHttpBinding
希望这会给你一些想法并让你再次前进。