2011-11-03 3 views
12

Sto cercando di collegare un C# app per Magento 1.6 (attraverso Magento SOAP V2) utilizzando il seguente codice:C# SOAP - Errore nella deserializzazione corpo del messaggio di risposta (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); 
} 

e ottengo il seguente errore:

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

ho usato Fiddler per controllare il trasferimento e questo è il risultato:

<?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> 

sono u cantano:

Tutte le idee come posso fi x (o debug) questo problema?

+0

domanda sciocca: si sta utilizzando il corretto SOAP/API username/passwor d? (diverso dal login della console di amministrazione) –

risposta

0

Sono molto sconosciuto con lo stack di sviluppo "Servizi Web == Soap == WS- *", ma so che Magento 1.6 ha introdotto qualcosa chiamato "Conformità WS-I" per la sua API. È necessario utilizzare l'URL Sapone V2, e anche impostare

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

"Sì" (in Admin del sistema Magento). Questo dirà a Magento di usare il gestore soap_wsi invece del gestore soap_v2. Potete vedere il controller che gestisce le richieste di Magento sapone a

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

Non ho idea se questo vi aiuterà, ma è incluso

  • WS-I Compliance

e le parole partita così c'è una possibilità esterna che aiuterà.

+0

Sì, questo è ciò che intendevo con "Sto usando WS-I Compliance", modificherò la domanda per renderla più chiara. Inoltre, solo per confermare - quando si utilizza WS-I, sai se dovrei usare il servizio web su: http://www.website.com/api/v2_soap?wsdl o dovrei usare qualcos'altro? – mas

+0

Ah, mi scuso, ho pensato che "Conformità WS-I" significasse qualcosa sul lato C#. Sì, "api/v2_soap" è l'URL corretto per attivare il gestore soap_wsi di Magento. –

+0

Grazie. La risposta di Magento sembra essere soddisfacente (sta inviando l'ID di sessione). Per caso, sai dove posso trovare ciò che Visual Studio si aspetta come risultato? – mas

22

questo è in realtà piuttosto facile da risolvere. Aprire il web.config/app.config per l'applicazione che si sta utilizzando per la connessione a Magento

trovare questa linea

<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> 

Annotare la configurazione di legame e il tipo di legame. Nella precedente basicHttpBinding/BasicBinding

Quindi individuare la seguente sezione di configurazione.

<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> 

Avviso la nidificazione qui, vincolante -> tipo binding -> elemento vincolante per nome

Quando Visual Studio genera il proxy i valori di default che dà per la quota lettore e tali non sono abbastanza grandi da conservare tutti i dati.Semplicemente aumentali tutti come ho fatto nell'esempio sopra.

+1

So che ora è abbastanza vecchio, ma se lo fai nel codice puoi aggiungere 'bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;' –

+2

@PaulFarry il tuo giusto, solo un problema c'è che devi ricordarti di fare ogni volta che crei un cliente. Farlo nella configurazione lo rende 'globale' per dire – iamkrillin

+0

Ho anche dovuto fare sotto basicHttpBinding –

0

Ho provato tutte le risposte di cui sopra ma non ha risolto il mio problema, nel mio caso particolare ho scoperto che erano i dati con problemi di tipo DateTime. In precedenza ero dati di impostazione come

2015-07-21T13: 55: 30,5,962405 millions + 05: 30 ->Non funziona

poi cambiato a
2015-03-29T09: 30: 47 ->lavoro

Alcuni come data non è stata in grado di serializzare