2011-11-03 17 views
12

Tôi đang cố gắng để kết nối một ứng dụng C# để Magento 1.6 (thông qua Magento SOAP V2) sử dụng đoạn mã sau:C SOAP # - Lỗi trong deserializing cơ thể của tin nhắn trả lời (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); 
} 

và tôi nhận được các lỗi sau:

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

tôi đã sử dụng Fiddler để kiểm tra việc chuyển nhượng và đây là kết quả:

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

tôi u hát:

Bất kỳ ý tưởng làm thế nào tôi có thể fi x (hoặc gỡ lỗi) vấn đề này?

+0

câu hỏi ngớ ngẩn: bạn có sử dụng đúng SOAP/username API/passwor d? (khác với thông tin đăng nhập của bảng điều khiển dành cho quản trị viên) –

Trả lời

0

Tôi rất không quen thuộc với toàn bộ "Web Services == Soap == WS- *" ngăn xếp phát triển, nhưng tôi biết Magento 1.6 đã giới thiệu một cái gì đó gọi là "Tuân thủ WS-I" cho API của nó. Bạn cần sử dụng URL xà phòng V2 và cũng có thể đặt

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

thành "Có" (trong Quản trị hệ thống của Magento). Điều này sẽ cho Magento sử dụng trình xử lý soap_wsi thay vì trình xử lý soap_v2. Bạn có thể thấy bộ điều khiển để xử lý các yêu cầu Magento Xà phòng tại

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

Không có ý tưởng nếu điều này sẽ giúp bạn, nhưng bạn đã bao gồm

  • WS-I Tuân

và những lời phù hợp để có cơ hội bên ngoài nó sẽ giúp ích.

+0

Vâng đó là ý của tôi với "Tôi đang sử dụng Tuân thủ WS-I", tôi sẽ chỉnh sửa câu hỏi để làm rõ hơn. Hơn nữa, chỉ để xác nhận - khi sử dụng WS-I, bạn có biết tôi nên sử dụng dịch vụ web tại: http://www.website.com/api/v2_soap?wsdl hay tôi nên sử dụng cái gì khác? – mas

+0

Ah, xin lỗi, tôi mặc dù "Tuân thủ WS-I" có ý nghĩa gì đó ở phía C#. Có, "api/v2_soap" là URL chính xác để kích hoạt trình xử lý soap_wsi của Magento. –

+0

Cảm ơn. Phản hồi từ Magento có vẻ là tốt (nó đang gửi ID phiên). Bởi bất kỳ cơ hội, bạn có biết nơi tôi có thể tìm thấy những gì Visual Studio là mong đợi như là một kết quả? – mas

22

điều này thực sự khá dễ sửa. Mở web.config/app.config cho ứng dụng mà bạn đang sử dụng để kết nối với Magento

tìm dòng này

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

Make lưu ý về cấu hình ràng buộc và loại ràng buộc. Trong phần cơ bản trênHttpBinding/BasicBinding

Tiếp theo định vị phần cấu hình sau.

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

Thông báo làm tổ ở đây, bắt buộc -> ràng buộc kiểu -> ràng buộc yếu tố theo tên

Khi visual studio tạo proxy các giá trị mặc định mà nó mang lại cho hạn ngạch đọc và như vậy là không đủ lớn để giữ tất cả dữ liệu.Đơn giản chỉ cần tăng tất cả chúng như tôi đã làm trong ví dụ trên.

+1

Tôi biết điều này là khá cũ bây giờ, nhưng nếu bạn đang làm điều này trong mã bạn có thể thêm 'bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;' –

+2

@PaulFarry quyền của bạn, chỉ có vấn đề là bạn phải nhớ để làm nó mỗi khi bạn tạo một khách hàng. Làm nó trong cấu hình làm cho nó 'toàn cầu' để nói – iamkrillin

+0

Tôi cũng đã phải làm dưới basicHttpBinding –

0

Tôi đã thử tất cả các câu trả lời ở trên nhưng nó không giải quyết được vấn đề của tôi, trong trường hợp cụ thể của tôi tôi phát hiện ra rằng đó là thành viên dữ liệu với loại DateTime tạo sự cố. Trước đây tôi đã thiết lập dữ liệu như

2015-07-21T13: 55: 30,5962405 + 05: 30 ->Không làm việc

sau đó thay đổi nó để
2015-03-29T09: 30: 47 ->Working

Một số cách ngày đã không thể serialize

Các vấn đề liên quan