【问题标题】:Savon with a custom binding带有自定义绑定的 Savon
【发布时间】:2017-01-02 12:11:15
【问题描述】:

我有一项可爱的任务是使用 Rails 处理大量的 SOAP api。 SOAP 服务具有三种不同的绑定; wsHttpBinding、带有 x509 的 wsHttpBinding 和自定义绑定。我只用 wsHttpBinding 就可以达到两个端点,但第三个需要用户名和密码,这不适用。由于证书,我避免使用 x509,并且自定义绑定在 SoapUI 中效果很好,但是使用 Savon 我得到以下错误。

由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action '' 的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

我已经将使用 Savon 生成的确切 XML 放入 SoapUI 中,它就可以工作了。

这可能是一个绑定问题吗?有没有办法告诉它使用这个自定义绑定?

这是我在 App.config 中找到的自定义绑定

<bindings>
  <customBinding>
    <binding name="cust">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport />
    </binding>
    <binding name="cust1">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport />
    </binding>
    <binding name="cust2">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport />
    </binding>
  </customBinding>
</bindings>
<endpoint address="http://api.xyz.com/stuff.svc/cust"
    binding="customBinding" bindingConfiguration="cust" contract="stuff.Xstuff"
    name="cust" />

编辑#1

这是我当前的客户端设置,以防万一。

@client = Savon.client(
      wsdl: 'http://api.xyz.com/stuff.svc?wsdl',
      wsse_auth: %w'username password',
      wsse_timestamp: true,
      raise_errors: false,
      log: true,
      log_level: :debug,
      soap_version: 2,
      pretty_print_xml: true,
      convert_request_keys_to: :none,
      use_wsa_headers: true,
      headers: {'Content-Type' => 'application/soap+xml; charset=utf-8'}

编辑#2

我发现了问题。 Savon 没有像 SoapUI 那样在 Content-Type 中设置操作。感谢@RicardoPontual 建议尝试再次比较 Savon 和 SoapUI 请求,这让我仔细观察并注意到问题。

headers: {'Content-Type' => 'application/soap+xml;charset=UTF-8;action="tempuri.org/stuf‌​f/set_table_stuff"'} 

【问题讨论】:

  • 您是否尝试过检查来自 savon 客户端和 SOAP UI 的肥皂消息?如果您启用登录服务,您可以检查传入的肥皂消息并找出任何相关的差异。
  • 我怀疑 savon 没有发送一些必需的标头或命名空间,请尝试比较两个请求并发布结果。
  • @RicardoPontual 到目前为止,我尝试比较这两个请求,但您的建议让我再次查看它。我发现了问题!原来 SoapUI 正在 Content-Type 中设置操作。所以我将我的“标题”更改为这个标题: {'Content-Type' => 'application/soap+xml;charset=UTF-8;action="tempuri.org/stuff/set_table_stuff"'} 现在它可以工作了。似乎 Savon 没有正确设置它。
  • 太好了,正如我所怀疑的,它在标题中丢失了一些东西。我认为问题在于行动。根据您设置合同的方式,您可以绕过该操作。

标签: ruby-on-rails ruby wcf soap savon


【解决方案1】:

根据我们在 cmets 中讨论的内容,在标题中添加您要使用的操作的操作可能会解决问题,如下所示:

@client = Savon.client(
      wsdl: 'http://api.xyz.com/stuff.svc?wsdl',
      wsse_auth: %w'username password',
      wsse_timestamp: true,
      raise_errors: false,
      log: true,
      log_level: :debug,
      soap_version: 2,
      pretty_print_xml: true,
      convert_request_keys_to: :none,
      use_wsa_headers: true,
      headers: {'Content-Type' => 'application/soap+xml;charset=UTF-8;action="tempuri.org/stuf‌​f/set_table_stuff"'}
      );

【讨论】:

    【解决方案2】:

    您需要在 Content-Type 标头中设置action="tempuri.org/stuf‌​f/set_table_stuff"',如下所示:

    @client = Savon.client(
          wsdl: 'http://api.xyz.com/stuff.svc?wsdl',
          wsse_auth: %w'username password',
          wsse_timestamp: true,
          raise_errors: false,
          log: true,
          log_level: :debug,
          soap_version: 2,
          pretty_print_xml: true,
          convert_request_keys_to: :none,
          use_wsa_headers: true,
          headers: {'Content-Type' => 'application/soap+xml; charset=UTF-8; action="tempuri.org/stuf‌​f/set_table_stuff";'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2020-08-29
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多