2011-11-03 119 views
12

Estoy tratando de conectar una aplicación de C# a Magento 1.6 (a través de Magento de SOAP V2) usando el siguiente código:C# de SOAP - Error en deserializar el cuerpo del mensaje de respuesta (Magento API)

using (Mage_Api_Model_Server_Wsi_HandlerPortTypeClient proxy = new Mage_Api_Model_Server_Wsi_HandlerPortTypeClient()) 
{ 
    string sessionId = proxy.login("XXXXXXX", "XXXXXXXXXXX"); 
    Console.WriteLine(sessionId); 
} 

y consigo el siguiente error:

Error in deserializing body of reply message for operation 'login'. 

que utiliza Fiddler para inspeccionar la transferencia y este es el resultado:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento"> 
<SOAP-ENV:Body> 
<ns1:loginResponseParam> 
<result>fc094df96480dbbcdXXXXXXXXXXXXXXX</result> 
</ns1:loginResponseParam> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

estoy u cantar:

Alguna idea de cómo puedo fi x (o depurar) este problema?

+0

pregunta tonta: ¿Está utilizando SOAP correcta/API nombre de usuario/passwor ¿re? (diferente del inicio de sesión de la consola de administración) –

Respuesta

0

Estoy muy familiarizado con con todo el paquete de desarrollo "Web Services == Soap == WS- *", pero sí sé que Magento 1.6 presentó algo llamado "WS-I Compliance" para su API. Es necesario utilizar la URL Jabón V2, y también establecer

System -> Configuration -> Magento Core Api -> General Settings -> WS-I Compliance 

a "Sí" (en la administración del sistema de Magento). Esto le indicará a Magento que use el controlador soap_wsi en lugar del controlador soap_v2. Se puede ver el controlador que maneja las solicitudes de jabón Magento en

app/code/core/Mage/Api/controllers/V2/SoapController.php 

ni idea de si esto le ayudará, pero se incluye

  • WS-I Cumplimiento

y las palabras coincidir así que hay una posibilidad de que esto ayude.

+0

Sí, eso es lo que quise decir con "Estoy usando WS-I Compliance", voy a editar la pregunta para que quede más clara. Además, solo para confirmar: al usar WS-I, ¿sabe si debería usar el servicio web en: http://www.website.com/api/v2_soap?wsdl o debería usar algo más? – mas

+0

Ah, disculpas, pensé que el "cumplimiento WS-I" significaba algo en el lado C#. Sí, "api/v2_soap" es la URL correcta para activar el controlador soap_wsi de Magento. –

+0

Gracias. La respuesta de Magento parece estar bien (está enviando la ID de la sesión). Por casualidad, ¿sabes dónde puedo encontrar lo que Visual Studio espera como resultado? – mas

22

esto es bastante fácil de arreglar. Abrir el web.config/app.config para la aplicación que está utilizando para conectarse a Magento

encontrar esta línea

<client> 
     <endpoint address="http://YourWeb.com/index.php/api/v2_soap/index/" binding="basicHttpBinding" bindingConfiguration="BasicBinding" contract="Webstore.Mage_Api_Model_Server_Wsi_HandlerPortType" name="Mage_Api_Model_Server_Wsi_HandlerPort" /> 
</client> 

tome nota de la configuración de enlace y el tipo de enlace. En el enlace básico anteriorHttpBinding/BasicBinding

A continuación, busque la siguiente sección de configuración.

<bindings> 
    <basicHttpBinding> 
     <binding name="BasicBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="999999" maxBufferPoolSize="999999" maxReceivedMessageSize="999999" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="999999" maxStringContentLength="999999" maxArrayLength="999999" maxBytesPerRead="999999" maxNameTableCharCount="999999" /> 
      <security mode="None" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 

Aviso el anidamiento aquí, encuadernación -> tipo de enlace -> elemento de unión por su nombre

Cuando Visual Studio genera el proxy los valores predeterminados que se da para la cuota lector y tales no son lo suficientemente grande como para mantener todos los datos.Simplemente increméntelos como lo hice en el ejemplo anterior.

+1

Sé que esto ya es bastante viejo, pero si estás haciendo esto en el código, puedes agregar 'bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;' –

+2

@PaulFarry a la derecha, el único problema es que tienes que acordarte de hacer cada vez que creas un cliente Hacerlo en la configuración lo hace 'global' para decir – iamkrillin

+0

También tuve que hacer en basicHttpBinding –

0

Intenté todas las respuestas anteriores pero no resolvió mi problema, en mi caso particular descubrí que eran miembros de datos con DateTime tipo creando un problema. Anteriormente yo estaba sentado de datos como

2015-07-21T13: 55: 30.5962405 + 05: 30 ->No funciona

luego lo cambiaron a
2015-03-29T09: 30: 47 ->Trabajo

Algunos cómo la fecha no fue capaz de serializar

Cuestiones relacionadas