在 C# 中调用 Magento SOAP V2 服务时出现问题

问题描述 投票:0回答:1

我使用 IIS 7.5 和 PHP 5.6(测试)在本地计算机上托管一个 magento 网上商店。该商店工作得很好,但现在我想使用 Visual Studio 2013 创建一个单独的应用程序。这些是我采取的步骤:

  1. 我已将域名“www.domain.com.local”添加到我的主机文件中,指向我的本地主机(www.domain.com.local -> 127.0.0.1)
  2. 我在 IIS 上创建了一个新网站并添加了新绑定(www.domain.com.local - 请参阅 1)
  3. 我已经使用 PHP 管理器添加了 WinCache 扩展,并将 PHP 版本设置为 5.6
  4. 在 magento 后端启用 WS-I 合规性(系统 > 配置 > Magento Core Api)
  5. 创建 SOAP 角色和用户(资源访问=全部)
  6. 打开 Visual Studio 2013 并创建一个新的控制台应用程序
  7. 添加新的服务参考 (http://www.domain.com.local/index.php/api/v2_soap/?wsdl)
  8. 尝试登录 - 这无法正常工作

这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        MainAsync(args).Wait();
    }

    static async Task MainAsync(string[] args)
    {

        using (var proxy = new Mage_Api_Model_Server_Wsi_HandlerPortTypeClient())
        {

            try
            {
                var loginResponse = await proxy.loginAsync("soap-admin", "xxxxxxxxx"); // api key
                var sessionId = loginResponse.result;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();

        }
    }
}

这是我收到的错误:

The content type text/xml; charset=utf-8,text/xml; charset=utf-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 297 bytes of the response were: '<?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>13fa067676759c3ce8ddd61c386b6d5c</result>
</ns1:loginResponseParam>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
'.

正如您所看到的,我正在获取我的 sessionId,但不断收到此错误。我还使用 fiddler 进行调查并获得正确的响应:HTTP 200 OK。有人知道问题可能是什么吗?与IIS有关吗?本地主机相关?

(当我添加 url 作为网络引用时,它工作得很好 - 旧的网络服务方法)。

我已阅读并尝试过的相关主题(未成功):

  1. C# SOAP - 反序列化回复消息正文时出错(Magento API)
  2. C#+Magento API V2:内容类型text/xml;字符集=utf-8,文本/xml;响应消息的 charset=UTF-8 不匹配
c# php magento soap magento-soap-api
1个回答
1
投票

如果从 Rian 的 Magento Stack Exchange 得到这个答案。所有学分均归Rian


解决方案:

您遇到的问题是 .NET/C# 无法解析 Magento 与其响应一起发送的内容类型。 SOAP 对于以正确的格式接收正确的内容是出了名的挑剔。再加上 PHP 协议的相当糟糕的实现,你会得到很多乐趣。

我正在查看 Magento 1.9 以获取以下信息:

经过一番挖掘,我发现 SOAP 调用的标头在第 52 行的

app/code/core/Mage/Api/Model/Server/V2/Adapter/Soap.php
中设置。

51. ->clearHeaders()
52. ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
53. ->setBod...

请注意,Content-Type 标头与您所需的字符集相匹配。将第 52 行调整为:


text/xml; charset=utf-8

告诉 Magento 强制覆盖该标头(如果已设置)。

确保使用

52. ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset, true)

的完整路径复制文件,以避免覆盖核心文件。当您想在某个时候升级 Magento 时,您会感谢我。


另外,请务必仔细查看,该文件中有两个 setHeader() 调用。

最后,还有一个兼容 WS-I 的 SOAP 适配器可用,同样的修复也适用于该文件。您可以在

app/code/local/Mage/...

中找到它。

    

© www.soinside.com 2019 - 2024. All rights reserved.