使用字符串从Java构建SOAP信封

时间:2013-04-28 04:03:04

标签: java wcf soap

我正在努力理解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信封与示例完全相同。

2 个答案:

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

希望这会给你一些想法并让你再次前进。