Импорт заказов на продажу из Magento с использованием C # (функция salesOrderList): «В документе XML есть ошибка (2, 372)» - PullRequest
2 голосов
/ 05 января 2012

Примечание. Этот вопрос изначально был частью Magento SOAP API V2 с C #: проблема с хранилищами, требующими HTTP-аутентификации , но я переместил его часть сюда как новый вопрос, так как одна часть уже былаответил на это сообщение.

ВЫПУСК: Я создал инструмент для импорта заказов на продажу из магазинов клиентов (magento) для интеграции в нашу традиционную систему обработки заказов.У меня есть пять магазинов для импорта.Три отлично работают.У двух из них возникает следующая проблема:

  • При выполнении вызова salesOrderList() выдается следующее исключение:

    Первое случайное исключение типа 'System.InvalidOperationException 'произошло в System.Xml.dll

    В XML-документе произошла ошибка (2, 372).

    Регистрация успешно выполнена, я могу перечислить значения атрибутов,и т.д. Но я не могу запустить функцию salesOrderList() с каким-либо фильтром (и null тоже).Было бы здорово, если кто-то имеет опыт в этом и может указать мне правильное направление, пожалуйста.


Обновление: Вызывающий вызов выглядит следующим образом:

salesOrderEntity[] soe = mservice.salesOrderList(mlogin, objSalesOrderFilterSet);

Исключение составляет Ошибка в XML-документе (2, 372).
InnerException, Указанный тип не был распознан: name = 'salesOrderListEntity', namespace = 'urn: Magento', at.

Fiddler показал следующее запрошенное и возвращено для вызова salesOrderList ():
Запрошено:

POST /api/v2_soap/index HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.239)
VsDebuggerCausalityData: uIDPoz6RG9JzwkdBniF95/gqmAcAAAAAhgJHnbvB1UOTE1y4R1Iq5VGLcSLUxTNDg57BO/4OizgACQAA
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:Mage_Api_Model_Server_V2_HandlerAction"
Host: www.contoso.com
Content-Length: 1753
Expect: 100-continue

Возвращено:

    POST http://www.contoso.com/api/v2_soap/index HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.239)
VsDebuggerCausalityData: uIDPoz6RG9JzwkdBniF95/gqmAcAAAAAhgJHnbvB1UOTE1y4R1Iq5VGLcSLUxTNDg57BO/4OizgACQAA
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:Mage_Api_Model_Server_V2_HandlerAction"
Host: www.contoso.com
Content-Length: 1753
Expect: 100-continue

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:Magento" xmlns:types="urn:Magento/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><tns:salesOrderList><sessionId xsi:type="xsd:string">2f9c5bdc898fd92c1f61981147ee5495</sessionId><filters href="#id1" /></tns:salesOrderList><tns:filters id="id1" xsi:type="tns:filters"><complex_filter href="#id2" /></tns:filters><soapenc:Array id="id2" soapenc:arrayType="tns:complexFilter[3]"><Item href="#id3" /><Item href="#id4" /><Item href="#id5" /></soapenc:Array><tns:complexFilter id="id3" xsi:type="tns:complexFilter"><key xsi:type="xsd:string">created_at</key><value href="#id6" /></tns:complexFilter><tns:complexFilter id="id4" xsi:type="tns:complexFilter"><key xsi:type="xsd:string">created_at</key><value href="#id7" /></tns:complexFilter><tns:complexFilter id="id5" xsi:type="tns:complexFilter"><key xsi:type="xsd:string">status</key><value href="#id8" /></tns:complexFilter><tns:associativeEntity id="id6" xsi:type="tns:associativeEntity"><key xsi:type="xsd:string">from</key><value xsi:type="xsd:string">2011-12-28 00:00:00</value></tns:associativeEntity><tns:associativeEntity id="id7" xsi:type="tns:associativeEntity"><key xsi:type="xsd:string">to</key><value xsi:type="xsd:string">2011-12-28 23:59:59</value></tns:associativeEntity><tns:associativeEntity id="id8" xsi:type="tns:associativeEntity"><key xsi:type="xsd:string">in</key><value xsi:type="xsd:string">processing</value></tns:associativeEntity></soap:Body></soap:Envelope>
HTTP/1.1 200 OK
Date: Thu, 05 Jan 2012 12:11:19 GMT
Server: Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/1.0.0-fips mod_bwlimited/1.4 mod_fcgid/2.3.6
X-Powered-By: PHP/5.3.6
Content-Length: 6302
Content-Type: text/xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:salesOrderListResponse><result SOAP-ENC:arrayType="ns1:salesOrderListEntity[1]" xsi:type="ns1:salesOrderListEntityArray"><item xsi:type="ns1:salesOrderListEntity"><increment_id xsi:type="xsd:string">100001306</increment_id><store_id 
...<more data>...
xsi:type="xsd:string">John</firstname><lastname xsi:type="xsd:string">Doe</lastname><telephone xsi:type="xsd:string">999-999-9999 ext. 3333</telephone><postcode xsi:type="xsd:string">11111</postcode></item></result></ns1:salesOrderListResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Ответы [ 2 ]

1 голос
/ 06 января 2012

Хорошо, здесь идет. Сервисная ссылка в оригинальной программе была создана путем указания адреса wsdl в одном из наших магазинов Magento Go. Программа позволяла динамически менять магазин для работы, поэтому URL-адрес был изменен на соответствующий URL-адрес магазина, добавленный с помощью /api/v2_soap/index во время выполнения.

Как объяснено в вопросе, импорт заказа на продажу работал на некоторых сайтах и ​​не работал на других. После некоторых довольно хороших советов от balexandre мы использовали fiddler и некоторый код на месте по мере необходимости и выяснили проблему.

Проблема была: Сервисный вызов salesOrderList() возвращает salesOrderEntity [] для Magento Go магазинов и salesOrderListEntity[] для магазинов 1.5.x. Поскольку прокси был создан с использованием ссылки на Magento Go, последний тип был «неожиданным» для программы, что вызвало Exception В XML-документе (2, 372) с * 1018 произошла ошибка * Указанный тип не был распознан: name = 'salesOrderListEntity', namespace = 'urn: Magento' . Все остальные методы, которые мы вызывали из веб-службы, работали. Но без списка заказов на продажу они не были бы полезны сами по себе.


Промежуточный обходной путь был: Чтобы настроить файл wsdl и reference.cs, чтобы объявить 'salesOrderListEntity and to create an overloaded version of salesOrderListEntity () `. Но этот обходной путь создал больше проблем, чем решил.


Окончательное решение: Создайте два разных прокси, указав на Magento Go и Magento 1.5.x. После переключения на фактические URL магазина во время выполнения, используйте прокси, соответствующий текущему магазину. Те же вызовы и поток, за исключением того, что первый прокси-сервер знает, что он получит salesOrderEntity[] для вызова salesOrderList(), а второй прокси-сервер знает, что он получит salesOrderListEntity[].

Это работает без проблем, и мы импортировали несколько сотен заказов на продажу, когда я пишу это. И это, кажется, хорошо работает и для магазинов 1.6.1. Но я дам вам знать, если (не дай Бог) будут какие-то проблемы на этом фронте.

В заключительной записке я выражаю искреннюю благодарность balexandre за всю помощь.

1 голос
/ 05 января 2012

Это легко исправить, хотя это может занять некоторое время, и вам нужно изменить код.

Проблема: Вы не можете использовать адрес Magento WSDL, если он не меньше 1.6.0, так как он содержит странные ошибки, которые исправлены только в 1.6, прочитайте примечания к выпуску каждого версия для получения дополнительной информации

Решение: Удалите все сервисные ссылки из своего проекта и создайте прокси с помощью утилиты svcutil.exe, указывающей на адрес wsdl, который получен из самого последнего Magento (даже если вы устанавливаете последний версия только для этого, последняя стабильная на данный момент версия 1.6.1).

Затем добавьте этот сгенерированный проект в ваш web / win проект и используйте сервис из него, а также поменяйте окончательный URL-адрес в объекте Client, например:

MyNameSpace.MagentoSoapClient ws = new MyNameSpace.MagentoSoapClient();
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://domain.com/api/v2_soap");

попробуй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...