2011-11-03 11 views
12

Próbuję połączyć C# aplikację do Magento 1.6 (poprzez Magento SOAP V2) za pomocą następującego kodu:C# SOAP - Błąd w deserializacji ciało wiadomości zwrotnej (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); 
} 

i dostaję następujący błąd:

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

użyłem Skrzypek do sprawdzenia transferu i jest to wynik:

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

jestem u śpiewać:

Jakieś pomysły jak mogę fi x (lub debugować) ten problem?

+0

głupie pytanie: Czy używasz poprawne API SOAP/nazwa_użytkownika/passwor re? (różni się od logowania do konsoli administracyjnej) –

Odpowiedz

0

Bardzo jestem nieznany z całym zestawem "Web Services == Soap == WS- *", ale wiem, że Magento 1.6 wprowadził coś, co nazywa się "Zgodność WS-I" ze względu na interfejs API. Musisz użyć adresu URL Mydła V2, a także ustawić

System -> Configuration -> Magento Core Api -> General Settings -> WS-I Compliance 
na "Tak" (w Administracji systemu Magento). Dzięki temu dowiesz Magento korzystać z obsługi soap_wsi zamiast obsługi soap_v2. Można zobaczyć kontroler, który obsługuje żądania Magento Mydło w

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

pojęcia, czy to pomoże, ale zawarte

  • WS-I Zgodność

i słowa pasuje w górę, więc jest szansa na zewnątrz, że pomoże.

+0

Tak właśnie miałem na myśli, mówiąc: "Korzystam z Zgodności WS-I", opiszę to pytanie, aby było wyraźniejsze. Co więcej, aby potwierdzić - podczas korzystania z WS-I, czy wiesz, czy powinienem używać usługi sieciowej pod adresem: http://www.website.com/api/v2_soap?wsdl czy powinienem użyć czegoś innego? – mas

+0

Ah, przepraszam, ja jednak "Zgodność z WS-I" oznaczało coś po stronie C#. Tak, "api/v2_soap" to poprawny adres URL, który uruchamia obsługę programu soap_wsi Magento. –

+0

Dzięki. Odpowiedź Magento wydaje się być w porządku (wysyła identyfikator sesji). Czy wiesz, gdzie mogę znaleźć to, czego spodziewa się Visual Studio? – mas

22

to jest rzeczywiście bardzo łatwe do naprawienia. Otwórz web.config/app.config dla aplikacji, której używasz do łączenia się z Magento

znaleźć tej linii

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

Zanotuj konfiguracji wiązania i typ wiązania. W powyższym basicHttpBinding/BasicBinding

Następny znajdź następujący fragment config.

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

Wskazówka gniazdowania tutaj, oprawa -> typ wiązania -> Element wiążący wg nazwy

Kiedy visual studio generuje proxy domyślne wartości, które daje do kontyngentu czytnika a takie nie są na tyle duże, aby trzymaj wszystkie dane.Po prostu zwiększ je wszystkie, tak jak zrobiłem to w powyższym przykładzie.

+1

Wiem, że to jest dość stare, ale jeśli robisz to w kodzie, możesz dodać 'bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;' –

+2

@PaulFarry prawy, tylko problem, musisz pamiętać, aby robić to za każdym razem, gdy tworzysz klienta. Robiąc to w konfiguracji, staje się "globalnym", aby powiedzieć – iamkrillin

+0

Musiałem również zrobić pod basicHttpBinding –

0

Próbowałem wszystkich powyższych odpowiedzi, ale to nie rozwiązało mojego problemu, w moim konkretnym przypadku okazało się, że to było członków danych z DateTime typu tworząc problem. Wcześniej zachodziło dane jako

2015-07-21T13: 55: +30,5962405 + 05: 30 ->Nie działa

potem zmienił je na
2015-03-29T09: 30: 47 ->robocza

Niektóre jak data nie była w stanie serializacji