【问题标题】:Building SOAP Envelope from Java using Strings使用字符串从 Java 构建 SOAP 信封
【发布时间】:2013-04-28 04:03:04
【问题描述】:

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

【问题讨论】:

  • WCF 服务是什么绑定,您使用的是哪个版本的 SOAP? WCF 将 basicHttpBinding 用于 SOAP 1.1 - 所有其他(我相信)都是 1.2。
  • 我们使用的是 SOAP 1.2,但我不确定我们使用的绑定。在这种情况下,我想要 BasicHttpBinding 似乎很合理
  • 经过快速检查,配置文件确实指定了我们使用basicHttpBinding <protocolMapping><add binding="basicHttpsBinding" scheme="https" /></protocolMapping> 或者这不是指定绑定的正确方法吗?
  • 这是客户端还是服务的配置文件?顺便说一句,basicHttp**s**bindingbasicHttpBinding 不同——第一个是为 TLS 设计的。此外,上面的段只是默认绑定。你能发布整个配置文件吗?
  • 这是服务的绑定。我只是在编写一个非 WCF 客户端应用程序来使用该服务。完整的配置文件在这里:gist.github.com/andrewnguyen42/5477069

标签: java wcf soap


【解决方案1】:

它应该工作。您可能缺少一些必需的标题。我建议使用 TCP 监视器,拦截工作请求并分析其内容。

【讨论】:

  • 它是 HTTP 标头吗?还是 SOAP 标头?在帖子中,我只将 Content-type 指定为“text/xml”。我对使用网络服务比较陌生,所以我想我不知道我还需要什么。
【解决方案2】:

我认为您收到 HTTP 400(错误请求)的原因是您的服务使用的是 SOAP 1.1 BasicHttpBinding,并且您很可能正在发送 SOAP 1.2 消息(正如您在 cmets 中指出的那样)正在使用 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 请求的默认协议映射从 BasicHttpBinding 更改为 WsHttpBinding

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

在您的配置文件中添加一个绑定部分,以便您可以将安全模式设置为无。这属于&lt;system.serviceModel&gt; 部分:

<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

希望这会给你一些想法,让你重新开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多