#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>
Я использую:
- Magento V 1.6
- Magento SOAP V2
- Соответствие WS-I (т.е. Для соответствия System / Configuration / Services / Magento Core API / WS-I установлено значение Yes)
- Исправление типа контента: ошибка типа контента, использующая веб-сервисы Magento 1.5 из .Net
- VS 2010
- .Net 3.5
Есть идеи, как я могу исправить (или отладить) эту проблему?
Комментарии:
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 #. Удачи