【问题标题】:Dealing with incorrect HTTP header body size values?处理不正确的 HTTP 标头正文大小值?
【发布时间】:2012-12-19 00:27:47
【问题描述】:

使用 C# ASP.NET MVC,在 Magento 网站上调用 web 服务时:

有时 Magento 站点会发送错误的 HTTP 标头,特别是 body-size 标头表示正文比实际大。例如它可能会说 body-size=1000,但 body 只包含 999 个字节。尽管标题不正确,但正文是正确的,所以我仍然希望能够处理它。

现在,当我尝试在 C# 中读取该响应时

var invoiceInfo = _magentoService.salesOrderInvoiceInfo(sessionId, invoiceId);

抛出异常:

Connection closed by remote host

这是有道理的,因为它试图读取第 1000 个字节但它不存在。更糟糕的是,读取正文的代码深埋在 .NET 框架中,所以我无法更改:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:Mage_Api_Model_Server_V2_HandlerAction", RequestNamespace="urn:Magento", ResponseNamespace="urn:Magento")]
[return: System.Xml.Serialization.SoapElementAttribute("result")]
public salesOrderInvoiceEntity salesOrderInvoiceInfo(string sessionId, string invoiceIncrementId) {
    object[] results = this.Invoke("salesOrderInvoiceInfo", new object[] {
                sessionId,
                invoiceIncrementId}); // exception thrown here
    return ((salesOrderInvoiceEntity)(results[0]));
}

我无法更改 Magento 网站,或修复导致此问题的任何问题(它是第 3 方网络服务器)。

我可以做些什么来改变我自己的 C# 代码的行为吗?我希望能够以某种方式强制它在到达正文的末尾时停止,并在出现这种情况时忽略此异常

【问题讨论】:

  • 这似乎是 Magento 核心团队需要解决的错误,而不是直接帮助您。相关:stackoverflow.com/questions/12792563/…
  • 是的,它也是一个非常烦人的错误 - 我正在寻找一种方法来忽略这个问题并阅读正文

标签: c# web-services magento http-headers


【解决方案1】:

我不知道这会起作用,但是您是否尝试过将代码放在 try / catch 块中并忽略异常? results == null吗?

像这样:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:Mage_Api_Model_Server_V2_HandlerAction", RequestNamespace="urn:Magento", ResponseNamespace="urn:Magento")]
[return: System.Xml.Serialization.SoapElementAttribute("result")]
public salesOrderInvoiceEntity salesOrderInvoiceInfo(string sessionId, string invoiceIncrementId) {
    try
    {
        object[] results = this.Invoke("salesOrderInvoiceInfo", new object[] {
                    sessionId,
                    invoiceIncrementId}); // exception thrown here
    }
    catch(Exception) {}

    if(results != null && results.Count() > 0) return ((salesOrderInvoiceEntity)(results[0]));

    throw new Exception("results is null");
}

【讨论】:

    【解决方案2】:

    从这里尝试解决方案(将 API 端点更改为 api.php):stackoverflow.com/a/36200828/1936722

    API url 基本改成:
    domain.com/index.php/api/v2_soap/index/wsdl/1

    到:

    domain.com/api/v2_soap/?wsdl=1

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2021-10-12
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多