【发布时间】: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/stuff/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