Подтвердить что ты не робот

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

Я пытаюсь подключить приложение С# к 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>

Я использую:

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

4b9b3361

Ответ 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>

Обратите внимание на конфигурацию привязки и тип привязки. В приведенном выше basicHttpBinding/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 генерирует прокси-сервер, значения по умолчанию, которые он дает для квоты читателя, и такие не достаточно велики, чтобы хранить все данные. Просто увеличьте их все, как я сделал в приведенном выше примере.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

  • Соблюдение WS-I

и слова совпадают, так что там есть шанс, что это поможет.