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


Problems calling Magento SOAP V2 Service in C#

我正在使用IIS 7.5和PHP 5.6在本地机器上托管一个magento网店(测试)。商店运行得很好,但现在我想使用visualstudio2013创建一个单独的应用程序。以下是我采取的步骤:

  1. 我已将域名"www.domain.com.local"添加到指向本地主机的主机文件中(www.domain.com.local->127.0.0.1)
  2. 我在我的IIS上创建了一个新网站,并添加了新的绑定(www.domain.com.local-请参阅1)
  3. 我在PHP Manager中添加了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进行了调查,并得到了正确的回应:HTTP200OK。有人知道可能是什么问题吗?是否与IIS相关?本地主机相关?

(当我添加url作为web引用时,它运行得很好——旧的web服务方法)。

我读过并尝试过的相关主题(没有成功):

  1. C#SOAP-反序列化回复消息正文时出错(Magento API)
  2. C#+Magento API V2:内容类型text/xml;charset=utf-8,text/xml;charset=响应消息的UTF-8不匹配

如果在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标头与text/xml; charset=utf-8所需的字符集相匹配。将线路52调整为:

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

告诉Magento,如果已经设置了该标头,则强制覆盖该标头。

确保使用app/code/local/Mage/...的完整路径复制文件,以避免覆盖核心文件。当你想在某个时候升级Magento时,你会感谢我的。

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

最后,还有一个WS-I兼容的SOAP适配器可用,同样的修复也适用于该文件。你可以在app/code/core/Mage/Api/Model/Server/Wsi/Adapter/Soap.php中找到它。