C # SOAP — ошибка при десериализации тела ответного сообщения (Magento API)

#web-services #magento #soap

#веб-сервисы #magento #soap

Вопрос:

Я пытаюсь подключить приложение C # к Magento 1.6 (через Magento SOAP V2), используя следующий код:

 using (Mage_Api_Model_Server_Wsi_HandlerPortTypeClient proxy = new Mage_Api_Model_Server_Wsi_HandlerPortTypeClient())
{
  string sessionId = proxy.login("XXXXXXX", "XXXXXXXXXXX");
  Console.WriteLine(sessionId);
}
  

и я получаю следующую ошибку:

 Error in deserializing body of reply message for operation 'login'.
  

Я использовал Fiddler для проверки передачи, и это результат:

 <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento">
<SOAP-ENV:Body>
<ns1:loginResponseParam>
<result>fc094df96480dbbcdXXXXXXXXXXXXXXX</result>
</ns1:loginResponseParam>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  

Я использую:

Есть идеи, как я могу исправить (или отладить) эту проблему?

Комментарии:

1. Глупый вопрос: используете ли вы правильное имя пользователя / пароль SOAP / API? (отличается от входа в консоль администратора)

Ответ №1:

на самом деле это довольно легко исправить. Откройте web.config/app.config для приложения, которое вы используете для подключения к magento

найдите эту строку

 <client>
      <endpoint address="http://YourWeb.com/index.php/api/v2_soap/index/" binding="basicHttpBinding" bindingConfiguration="BasicBinding" contract="Webstore.Mage_Api_Model_Server_Wsi_HandlerPortType" name="Mage_Api_Model_Server_Wsi_HandlerPort" />
</client>
  

Обратите внимание на конфигурацию привязки и тип привязки. В приведенном выше базовом HttpBinding /BasicBinding

Затем найдите следующий раздел конфигурации.

 <bindings>
  <basicHttpBinding>
      <binding name="BasicBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="999999" maxBufferPoolSize="999999" maxReceivedMessageSize="999999" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="999999" maxStringContentLength="999999" maxArrayLength="999999" maxBytesPerRead="999999" maxNameTableCharCount="999999" />
          <security mode="None" />
      </binding>
  </basicHttpBinding>
</bindings>
  

Обратите внимание на вложенность здесь, привязка -> тип привязки -> элемент привязки по имени

Когда Visual Studio генерирует прокси, значения по умолчанию, которые он дает для квоты чтения и тому подобное, недостаточно велики для хранения всех данных. Просто увеличьте их все, как я сделал в приведенном выше примере.

Комментарии:

1. Я знаю, что это уже довольно старое, но если вы делаете это в коде, вы можете добавить bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;

2. @PaulFarry ваше право, единственная проблема в том, что вы должны помнить, чтобы делать это каждый раз, когда вы создаете клиента. Выполнение этого в конфигурации делает его «глобальным», чтобы сказать

3. Мне также пришлось выполнить <readerQuotas MaxStringContentLength=»bignumber»> в разделе BasicHttpBinding

4. Я не знаю, что все это значит, но это устранило мою проблему. Спасибо!

Ответ №2:

Я перепробовал все приведенные выше ответы, но это не решило мою проблему, в моем конкретном случае я обнаружил, что это были элементы данных с типом DateTime, создающие проблему. Ранее я устанавливал данные как

2015-07-21T13:55:30.5962405 05:30 -> Не работает

затем изменил его на
2015-03-29T09:30:47 -> Работает

Некоторые даты не удалось сериализовать

Комментарии:

1. Как это исправить в клиентском приложении при получении XML от веб-службы?

Ответ №3:

Я очень незнаком со всем стеком разработки «Web Services == Soap == WS- *», но я знаю, что Magento 1.6 представил нечто, называемое «Соответствие WS-I» для своего API. Вам необходимо использовать URL-адрес Soap версии V2, а также установить

 System -> Configuration -> Magento Core Api -> General Settings -> WS-I Compliance
  

на «Да» (в системе администратора Magento). Это подскажет Magento использовать soap_wsi обработчик вместо soap_v2 обработчика. Вы можете увидеть контроллер, который обрабатывает запросы Magento Soap на

 app/code/core/Mage/Api/controllers/V2/SoapController.php
  

Не знаю, поможет ли это вам, но вы включили

  • Соответствие WS-I

и слова совпадают, поэтому есть вероятность, что это поможет.

Комментарии:

1. Да, это то, что я имел в виду, говоря «я использую соответствие WS-I», я отредактирую вопрос, чтобы сделать его более понятным. Более того, просто для подтверждения — при использовании WS-I, знаете ли вы, следует ли мне использовать веб-службу по адресу: website.com/api/v2_soap?wsdl или я должен использовать что-то другое?

2. Ах, прошу прощения, я думал, что «соответствие WS-I» что-то значит на стороне C #. Да, «api / v2_soap» — это правильный URL-адрес для запуска обработчика soap_wsi в Magento.

3. Спасибо. Ответ от Magento, похоже, в порядке (он отправляет идентификатор сеанса). Случайно, вы не знаете, где я могу найти то, что Visual Studio ожидает в результате?

4. @mas Понятия не имею, не разработчик C #. Удачи

Ответ №4:

Я обновил ссылку на веб-службу, и она работает для меня.

Поскольку сторонние службы могут быть изменены / обновлены, и вы также должны быть обновлены в своей среде.

введите описание изображения здесь