Невозможно вызвать методы веб-службы через SOAP Connection (SAVON) в Ruby on Rails. Куда я иду не так? - PullRequest
1 голос
/ 12 сентября 2011

Кажется, я получаю это сообщение об ошибке:

(a: ActionNotSupported) Сообщение с действием «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 ]

1 голос
/ 16 сентября 2011

Кажется, это так, как его называли ... Что-то очень простое.

Переопределение, изложенное в руководстве SAVON, рекомендуется, если у вас есть заглавная буква, начинающаяся с верблюда, не работает.Может быть, учебник устарел.(Примечание: в моем случае требуется wsdl)

Так что это не сработало:

response = client.request :wsdl, "GetCustomerCentreDetails"

Изменение его на:

 response = client.request :wsdl, :get_customer_centre_details

Тогда, очевидно, мне нужендобавлено тело, заголовок и т. д.

Предположение, которое вызвало у меня путаницу: Возможность получить WSDL не означает, что вы подключены к веб-сервису.

0 голосов
/ 13 сентября 2011

кажется, вам не хватает этой части

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

вы должны вставить что-то вроде следующего в ваш запрос

soap.header = {"Action" =>
                {'env:mustUnderstand' =>
                 'http://tempuri.org/IIBCSServices/GetServices',
                attributes! => { 'mustUnderstand' => "1", 'xmlns' => "..." }
              }
...