Невозможно получить продукты в каталоге каталога продуктов SOAP API Magento 1.6.1.0, если у меня более 25 продуктов - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь перечислить все мои продукты с интерфейсом SOAP v2 в C # (.Net 4.0, VS 2010), используя WS-I-совместимую версию интерфейса SOAP, созданную WSDL в Magento 1.6.1.0.

Я могу обычно получать товары с помощью своего кода (см. Приложение ниже), когда у меня менее 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 ]

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

У нас есть предприятие magento, и мы смогли найти исправление БЕЗ модификации ядра!Это так просто, это грустно.Наша проблема в том, что наш php poutput упакован как большая часть php серверов.в C # ИЛИ PHP используйте флаг разрешения декомпозиции на веб-сервисе:

mservice.EnableDecompression = true;

, где mservice - имя вашего сервиса.

0 голосов
/ 03 апреля 2012

Была такая же проблема с Magento 1.6.2.0 и VisualBasic. После удаления всех ненужных пробелов все работает нормально. Кажется, "\n" не совместим с crlf переносами строк в мире Windows (возможно, это должно быть "\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>

Создайте свой собственный класс адаптера в MyCompany/MyModule/Model/Server/WSI/Adapter/Soap.php с настроенным методом run ():

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 без лишних символов, которые вызывают странные ошибки.

0 голосов
/ 14 декабря 2011

Похоже, что проблема связана с magento попробуйте найти "\ n" и заменить на "" в

\ Magento \ приложение \ код \ ядро ​​\ Mage \ Api \ Model \ Server \ Wsi \ адаптер \ Soap.php (рекомендуется резервное копирование предыдущей версии; P) (лучший подход - это исключить участвующие классы, но это только быстрый тест ...)

0 голосов
/ 21 декабря 2011

Проблема определенно находится в \ magento \ app \ code \ core \ Mage \ Api \ Model \ Server \ Wsi \ Adapter \ Soap.php

У меня была эта проблема в C #неделями!!!Он действительно не понимает \ n .Удалите их, и оно должно работать

0 голосов
/ 06 декабря 2011

Скорее всего, происходит то, что время запроса истекает либо из-за php, либо из-за дб (угадывание mysql).

Что вы можете сделать, чтобы проверить это, где у вас есть эта строка: ms.catalogProductList (sessionID, filter, ""); установите фильтр, чтобы получить один конкретный идентификатор продукта. затем просто зациклите вызов списка товаров при увеличении productId. (что-то вроде "productId eq 12")

Если все продукты могут быть извлечены таким образом, то, скорее всего, это проблема тайм-аута / ресурса на вашем сервере mage. Если нет, то это скорее всего связано с конкретным продуктом.

Если вы можете получить их один за другим, то следующим шагом будет сокращение количества обращений к списку товаров с помощью фильтра по productID> X и ProductID

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