我正在尝试在C#(。Net 4.0,VS 2010)中使用SOAP v2接口列出我的所有产品,使用Magento 1.6.1.0中WS-I兼容的WSDL生成版本的SOAP接口。
当我的产品少于25件时,我可以使用我的代码(下面附件)正常检索产品。但是,当我有25个或更多产品时,我收到错误:
Unhandled Exception: System.InvalidOperationException: There is an error in XML
document (333, 2). ---> System.Xml.XmlException: Unexpected end of file has occu
rred. The following elements are not closed: complexObjectArray, result, ns1:cat
alogProductListResponseParam, SOAP-ENV:Body, SOAP-ENV:Envelope. Line 333, positi
on 2.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ThrowUnclosedElements()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.MoveToContent()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMagent
oService.Read32_catalogProductEntity(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMagent
oService.Read121_Item()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer86.De
serialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, St
ring encodingStyle, XmlDeserializationEvents events)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, St
ring encodingStyle, XmlDeserializationEvents events)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClie
ntMessage message, WebResponse response, Stream responseStream, Boolean asyncCal
l)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodN
ame, Object[] parameters)
at MagentoAPITest.mage.MagentoService.catalogProductList(String sessionId, fi
lters filters, String store) in ....\technology\c#\MagentoAPITest
\MagentoAPITest\Web References\mage\Reference.cs:line 1982
at MagentoAPITest.magentoHelper.GetProducts() in ....\technolo
gy\c#\MagentoAPITest\MagentoAPITest\magentoHelper.cs:line 62
at MagentoAPITest.Program.Main(String[] args) in ....g\technolo
gy\c#\MagentoAPITest\MagentoAPITest\Program.cs:line 30
Press any key to continue . . .
我正在创造什么样的产品似乎并不重要;我总是抛出这个错误。
我可以继续添加产品;当我这样做时,错误会略微改变(在50个产品的情况下)
Unhandled Exception: System.InvalidOperationException: There is an error in XML
document (666, 2). ---> System.Xml.XmlException: Unexpected end of file has occurred. The following elements are not closed: complexObjectArray, result, ns1:catalogProductListResponseParam, SOAP-ENV:Body, SOAP-ENV:Envelope. Line 666, position 2.
我认为这意味着Magento正在发送适当的数据;但是,我怀疑C#没有正确解析数据?
作为参考,我通过以下方式检索我的产品:
public List<mage.catalogProductEntity> GetProducts()
{
//var result = ms.call(sessionID, "catalog_product.list", null);
// retrieve products
mage.filters filter = new mage.filters();
mage.catalogProductEntity[] products = new mage.catalogProductEntity[1];
try
{
products = ms.catalogProductList(sessionID, filter, "");
}
catch (System.InvalidOperationException e)
{
Console.WriteLine(e.Message);
System.Xml.XmlException xe = (System.Xml.XmlException ) e.InnerException;
Console.WriteLine(xe.SourceUri);
throw;
}
foreach (mage.catalogProductEntity product in products)
{
Console.WriteLine(product.product_id + ", "
+ product.name + ", "
+ product.type + ", "
+ product.sku + ", "
+ product.set + "");
}
List<mage.catalogProductEntity> ProductsList = new List<mage.catalogProductEntity>(products);
return ProductsList;
}
有谁知道为什么会这样?
非常感谢!
答案 0 :(得分:1)
我们有magento企业,能够找到修复而不修改核心!它很难过,很难过。我们的问题是我们的php poutput像许多php服务器输出一样被压缩。在C#或PHP中,使用Web服务上的enable decomression标志:
mservice.EnableDecompression = true;
其中mservice是您的服务名称。
答案 1 :(得分:0)
最有可能发生的事情是请求因为php或db(猜测mysql)而超时。
你可以做些什么来测试它,就是你拥有这条线的地方: ms.catalogProductList(sessionID,filter,“”); 设置过滤器以提取一个特定的productID。然后在增加productId时循环遍历产品列表调用。 (类似“productId eq 12”)
如果可以通过这种方式提取所有产品,那么可能是您的法师服务器上的超时/资源问题。如果没有,那么它可能与特定产品有关。
假设您可以逐个获取它们,那么下一步就是通过使用productID&gt;上的过滤器来减少对产品列表的调用次数。 X和ProductID&lt; X + 10(或您喜欢的任何数字)。
答案 2 :(得分:0)
似乎与magento问题有关 尝试搜索“\ n”并在
中替换为“”\ Magento的\应用\代码\核心\法师\阿比\模型\服务器\ WSI \适配器\ Soap.php (建议使用备用备份; P) (最好的方法是退出所涉及的课程,但这只是一个快速测试...)
答案 3 :(得分:0)
问题肯定在 \ magento \ app \ code \ core \ Mage \ Api \ Model \ Server \ Wsi \ Adapter \ Soap.php
我在C#中遇到这个问题好几个星期了! 它并不真正理解 \ n 。删除它们,它应该工作
答案 4 :(得分:0)
与Magento 1.6.2.0和VisualBasic有同样的问题。删除所有不需要的空格后,它工作正常。
似乎"\n"
与Windows世界中的crlf
换行符不兼容(如果您想要换行,可能应该是"\r\n"
。)
不是调整核心文件,而是在自己的模块中重写类更好。
添加到您的MyCompany/MyModule/etc/config.xml
<config>
<!-- other stuff -->
<global>
<models>
<api>
<rewrite>
<server_wsi_adapter_soap>MyCompany_MyModule_Model_Server_WSI_Adapter_Soap</server_wsi_adapter_soap>
</rewrite>
</api>
</models>
</global>
</config>
使用调整后的run()方法在MyCompany/MyModule/Model/Server/WSI/Adapter/Soap.php
中创建自己的适配器类:
class MyCompany_MyModule_Model_Server_WSI_Adapter_Soap extends Mage_Api_Model_Server_Adapter_Soap
{
public function run(){
$apiConfigCharset = Mage::getStoreConfig("api/config/charset");
if ($this->getController()->getRequest()->getParam('wsdl') !== null) {
$wsdlConfig = Mage::getModel('api/wsdl_config');
$wsdlConfig->setHandler($this->getHandler())
->init();
$this->getController()->getResponse()
->clearHeaders()
->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
->setBody(
preg_replace(
'/(\>\s+\<)/i', // changed to match all whitespace enclosed by > and <
"><", // replace it with just ><
str_replace(
'<soap:operation soapAction=""></soap:operation>',
"<soap:operation soapAction=\"\" />", // removed the \n
str_replace(
'<soap:body use="literal"></soap:body>',
"<soap:body use=\"literal\" />", // removed the \n
preg_replace(
'/<\?xml version="([^\"]+)"([^\>]+)>/i',
'<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
$wsdlConfig->getWsdlContent()
)
)
)
)
);
} else {
try {
$this->_instantiateServer();
$this->getController()->getResponse()
->clearHeaders()
->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
->setBody(
preg_replace(
'/(\>\s+\<)/i', // same here
"><", // and here
str_replace(
'<soap:operation soapAction=""></soap:operation>',
"<soap:operation soapAction=\"\" />", // removed the \n
str_replace(
'<soap:body use="literal"></soap:body>',
"<soap:body use=\"literal\" />", // removed the \n
preg_replace(
'/<\?xml version="([^\"]+)"([^\>]+)>/i',
'<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
$this->_soap->handle()
)
)
)
)
);
} catch( Zend_Soap_Server_Exception $e ) {
$this->fault( $e->getCode(), $e->getMessage() );
} catch( Exception $e ) {
$this->fault( $e->getCode(), $e->getMessage() );
}
}
return $this;
}
}
这将输出干净的XML,没有导致奇怪错误的不需要的字符。