在C#中调用Magento SOAP V2服务的问题

时间:2014-11-03 15:45:00

标签: c# php magento iis soap

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

  1. 我已经添加了域名" www.domain.com.local"到我的主机文件,指向我的localhost(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核心Api)
  5. 创建SOAP角色和用户(资源访问=全部)
  6. 打开visual studio 2013并创建新的控制台应用程序
  7. 添加新的服务参考(http://www.domain.com.local/index.php/api/v2_soap/?wsdl
  8. 尝试登录 - 这不应该是
  9. 以下是我的代码:

    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有关吗? localhost相关吗?

    (当我将url添加为web引用时,它的工作原理很好 - 旧的webservice方法)。

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

    1. C# SOAP - Error in deserializing body of reply message (Magento API)
    2. C#+Magento API V2:The content type text/xml; charset=utf-8,text/xml; charset=UTF-8 of the response message does not match

1 个答案:

答案 0 :(得分:1)

如果在Magento Stack Exchange获得了Rian的回答。所有积分均转至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找到它。