С# 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>
Я использую:
Любые идеи, как я могу исправить (или отладить) эту проблему?
Ответы
Ответ 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
Не знаю, поможет ли это вам, но вы включили
и слова совпадают, так что там есть шанс, что это поможет.