注意:这个问题最初是 Magento SOAP API V2 with C#: Issue with Stores that Require HTTP Authentication 的一部分,但我已将其中一部分移至此处作为新问题,因为其中一部分已在那篇文章中得到了回答。
问题:
我构建了一个工具来从客户商店 (magento) 导入销售订单,以便集成到我们的旧订单处理系统中。 我有五家商店可供进口。 三个工作正常。 其中两人有以下问题:
执行
salesOrderList()
调用时抛出以下异常:
System.Xml.dll 中发生“System.InvalidOperationException”类型的第一次机会异常
XML 文档中有错误 (2, 372)。
登录成功,可以枚举属性值等。 但我无法使用任何命令运行
salesOrderList()
函数
过滤器(还有null
)。 如果有人有经验那就太好了
有了这个,请给我指出正确的方向。
更新:调用如下:
salesOrderEntity[] soe = mservice.salesOrderList(mlogin, objSalesOrderFilterSet);
例外情况是, XML 文档 (2, 372) 中存在错误。
InnerException 是,无法识别指定的类型:name='salesOrderListEntity',namespace='urn:Magento',位于 .
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>
这有一个简单的修复方法,尽管可能需要一些时间并且您需要更改一些代码。
问题:如果不低于1.6.0,则无法使用Magento WSDL地址,因为它包含仅在1.6中修复的奇怪错误,请阅读每个版本的发行说明以获取更多信息
解决方案:从项目中删除所有服务引用,并使用指向来自最新 Magento 的
svcutil.exe
地址的 wsdl
实用程序创建代理(即使您只是为此安装最新版本,迄今为止最新的稳定版本是 1.6.1)。
然后将生成的项目添加到您的 web/win 项目并使用其中的服务,并交换 Client 对象中的最终 url,例如:
MyNameSpace.MagentoSoapClient ws = new MyNameSpace.MagentoSoapClient();
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://domain.com/api/v2_soap");
尝试一下。
好的,开始了。 原始程序中的服务引用是通过指向我们的 Magento Go 商店之一下的
wsdl
地址创建的。 该程序允许动态更改要使用的商店,因此 URL 在运行时更改为附加有 /api/v2_soap/index
的相关商店 URL。
正如问题中所解释的,销售订单导入对于某些网站有效,而对于其他网站则失败。 在 balexandre 提供了一些很好的建议后,我们根据需要使用了 fiddler 和一些现场代码并解决了问题。
问题是: 服务调用
salesOrderList()
返回 Magento Go 商店的 salesOrderEntity[] 和 1.5.x 商店的 salesOrderListEntity[]
。 由于代理是使用 Magento Go 引用创建的,后一种类型对于程序来说是“意外的”,从而导致 Exception
XML 文档 (2, 372) 中存在错误,并带有 innerException
指定的内容无法识别类型:名称='salesOrderListEntity',命名空间='urn:Magento'。 不过,我们从 Web 服务调用的所有其他方法都有效。 但如果没有销售订单列表,它们本身并没有多大用处。
中间解决方法是: 调整
wsdl
文件和 reference.cs
以声明“salesOrderListEntityand to create an overloaded version of
salesOrderListEntity()`。 但这种解决方法产生的问题比它解决的问题还要多。
最终解决方案是: 通过指向 Magento Go 和 Magento 1.5.x 创建两个不同的代理。 在运行时切换到实际商店 URL 后,使用与当前商店相关的代理。 相同的调用和流程,除了第一个代理知道它将接收
salesOrderEntity[]
调用的 salesOrderList()
,而第二个代理知道它将接收 salesOrderListEntity[]
。
这工作没有问题,在我写这篇文章时我们已经导入了几百个销售订单。 它似乎也适用于 1.6.1 商店。 但如果(上帝禁止)这方面有任何问题,我会让你知道。
最后,我衷心感谢 balexandre 提供的所有帮助。