Savon带有自定义绑定

Kev*_*inM 5 ruby wcf soap ruby-on-rails savon

我有一个很好的任务,就是使用带有Rails的大量SOAP api.SOAP服务有三种不同的绑定; wsHttpBinding,wsHttpBinding与x509,以及自定义绑定.我只能使用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" />
Run Code Online (Sandbox Code Playgroud)

编辑#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'}
Run Code Online (Sandbox Code Playgroud)

编辑#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"'} 
Run Code Online (Sandbox Code Playgroud)

Ric*_*ual 1

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

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