我似乎收到此错误消息:
(a:ActionNotSupported)不能使用Action'GetServices'的消息 由于ContractFilter不匹配而在接收器处理 EndpointDispatcher。这可能是因为合同不匹配 (发送方和接收方之间不匹配的操作)或绑定/安全性 发送者和接收者之间不匹配。检查发件人和 接收者具有相同的合同和相同的约束力(包括 安全要求,例如消息,传输,无)。
我认为它与安全/绑定设置有关。 我的连接使用HTTP,使用basichttpbinding。我已经做了很多寻找答案,就像我一直那样,但我无法修复它,而且这里没有人有关于Ruby on Rails的专业知识。
帮助将不胜感激。
下面是我的代码,在Ruby on Rails中,它初始化服务然后调用它。注意:我可以正常连接。它已成功报告了可用的方法。只是调用方法似乎是问题。我已使用相同的代码成功连接到在线测试服务。我用Savon。
def test
puts "web_service: IN"
client = Savon::Client.new do
wsdl.document = "http://hidden.co.uk/myService.svc?wsdl"
end
@response = client.request "GetServices", :xmlns => "http://tempuri.org/" do
soap.header = {}
soap.body = {
"CostCentreNo" => 1,
"filter" => 0
}
end
puts '##########################'
puts @response.to_hash;
end
以下是我的Ruby on Rails发送的内容:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:wsdl="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<GetServices xmlns="http://tempuri.org/">
<CostCentreNo>1</CostCentreNo>
<filter>0</filter>
</GetServices>
</env:Body>
</env:Envelope>
这是WCF测试客户端发送的(有效)
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IIBCSServices/GetServices</Action>
</s:Header>
<s:Body>
<GetServices xmlns="http://tempuri.org/">
<CostCentreNo>0</CostCentreNo>
<filter>0</filter>
</GetServices>
</s:Body>
</s:Envelope>
答案 0 :(得分:1)
这似乎是被称为的方式...这么简单。
覆盖SAVON教程中的覆盖,如果你有一个大写的起始,则推荐使用camelcase。也许教程已经过时了。 (注意,在我的情况下需要wsdl)
所以这不起作用:
response = client.request :wsdl, "GetCustomerCentreDetails"
将其更改为:
response = client.request :wsdl, :get_customer_centre_details
然后显然我需要添加一个正文,标题等。
让我感到困惑的假设:能够获得WSDL并不意味着您已连接到Web服务。
答案 1 :(得分:0)
似乎你错过了这部分
<Action s:mustUnderstand="1" ...>
您应该在请求中插入以下内容
soap.header = {"Action" =>
{'env:mustUnderstand' =>
'http://tempuri.org/IIBCSServices/GetServices',
attributes! => { 'mustUnderstand' => "1", 'xmlns' => "..." }
}