当我有超过25个产品时,无法在Magento 1.6.1.0的SOAP API的CatalogProductList中获得产品

时间:2011-12-06 15:43:52

标签: c# magento

我正在尝试在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;
        }

有谁知道为什么会这样?

非常感谢!

5 个答案:

答案 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,没有导致奇怪错误的不需要的字符。