1

我似乎收到此错误消息:

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

我认为这与安全/绑定设置有关。我的连接使用 HTTP,带有基本的 httpbinding。像往常一样,我已经做了很多寻找答案的工作,但无法修复它,而且这里没有人拥有 Ruby on Rails 方面的专业知识。

帮助将不胜感激。

下面是我在 Ruby on Rails 中的代码,它初始化服务然后调用它。注意:我可以很好地连接到它。它已经成功地报告了可用的方法。只是调用方法似乎是问题所在。我已经使用相同的代码成功连接到在线测试服务。我用萨文。

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

2 回答 2

1

这似乎是它被称为的方式......如此简单的事情。

SAVON 教程中所述的覆盖,如果您有一个大写的驼峰式开头不起作用,建议您使用。也许教程已经过时了。(注意, :wsdl 在我的情况下是必需的)

所以这不起作用:

response = client.request :wsdl, "GetCustomerCentreDetails"

将其更改为:

 response = client.request :wsdl, :get_customer_centre_details

然后显然我需要添加一个正文和标题等。

让我感到困惑的假设:能够获得 WSDL 并不意味着您已连接到 Web 服务。

于 2011-09-16T10:23:39.027 回答
0

看来你错过了这部分

<Action s:mustUnderstand="1" ...>

您应该在您的请求中插入类似以下内容

soap.header = {"Action" =>
                {'env:mustUnderstand' =>
                 'http://tempuri.org/IIBCSServices/GetServices',
                attributes! => { 'mustUnderstand' => "1", 'xmlns' => "..." }
              }
于 2011-09-13T15:40:39.083 回答