无法通过Ruby on Rails中的SOAP连接(SAVON)调用Web服务方法。我哪里错了?

时间:2011-09-12 15:06:06

标签: ruby-on-rails ruby soap savon

我似乎收到此错误消息:

  

(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>

2 个答案:

答案 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' => "..." }
              }