【问题标题】:C# SOAP - Error in deserializing body of reply message (Magento API)C# SOAP - 反序列化回复消息正文时出错(Magento API)
【发布时间】:2011-12-21 06:25:56
【问题描述】:

我正在尝试使用以下代码将 C# 应用程序连接到 Magento 1.6(通过 Magento SOAP V2):

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

我收到以下错误:

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

我使用 Fiddler 检查传输,结果如下:

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

我正在使用:

有什么想法可以解决(或调试)这个问题吗?

【问题讨论】:

  • 愚蠢的问题:您使用的是正确的 SOAP/API 用户名/密码吗? (不同于管理控制台登录)

标签: web-services magento soap


【解决方案1】:

我对整个“Web Services == Soap == WS-*”开发堆栈非常不熟悉,但我知道 Magento 1.6 引入了一个称为“WS-I Compliance”的东西API。您需要使用 V2 Soap URL,并设置

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

到“是”(在 Magento 系统的管理员中)。这将告诉 Magento 使用 soap_wsi 处理程序而不是 soap_v2 处理程序。您可以在

处查看处理 Magento Soap 请求的控制器
app/code/core/Mage/Api/controllers/V2/SoapController.php

不知道这是否会帮助你,但你包括

  • WS-I 合规性

而且单词匹配,因此有一个外部机会会有所帮助。

【讨论】:

  • 是的,这就是我所说的“我正在使用 WS-I 合规性”的意思,我将编辑问题以使其更清楚。此外,只是为了确认一下 - 在使用 WS-I 时,您知道我应该使用位于 website.com/api/v2_soap?wsdl 的 Web 服务还是应该使用其他东西?
  • 啊,抱歉,我虽然“WS-I 合规性”在 C# 方面意味着什么。是的,“api/v2_soap”是触发 Magento 的 soap_wsi 处理程序的正确 URL。
  • 谢谢。 Magento 的响应似乎很好(它正在发送会话 ID)。无论如何,您知道我在哪里可以找到 Visual Studio 所期望的结果吗?
  • @mas 不知道,不是 C# 开发人员。祝你好运
【解决方案2】:

这实际上很容易解决。打开您用于连接到 magento 的应用程序的 web.config/app.config

找到这一行

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

记下绑定配置和绑定类型。在上面basicHttpBinding/BasicBinding

接下来找到以下配置部分。

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

注意这里的嵌套,绑定 -> 绑定类型 -> 按名称绑定元素

当 Visual Studio 生成代理时,它为读者配额提供的默认值不足以容纳所有数据。就像我在上面的例子中所做的那样简单地增加它们。

【讨论】:

  • 我知道这已经很老了,但如果你在代码中这样做,你可以添加bind.ReaderQuotas = Xml.XmlDictionaryReaderQuotas.Max;
  • @PaulFarry 你的权利,唯一的问题是你必须记住每次创建客户端时都要这样做。在配置中执行此操作使其成为“全局”来说
  • 我还必须在 basicHttpBinding 下做
  • 我不知道这一切意味着什么,但它解决了我的问题。谢谢!
【解决方案3】:

我尝试了上述所有答案,但没有解决我的问题,在我的特殊情况下,我发现是 DateTime 类型的数据成员造成了问题。 以前我将数据设置为

2015-07-21T13:55:30.5962405+05:30 -> 不工作

然后改成
2015-03-29T09:30:47 -> 工作

有些日期无法序列化

【讨论】:

  • 从 Web 服务接收 XML 时,如何在客户端应用程序中解决此问题?
【解决方案4】:

我更新了 Web 服务参考,它对我有用。

因为第三方服务可能会更改/更新,您也应该在您的环境中进行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多