处理不正确的HTTP头部大小值?

5
使用C# ASP.NET MVC时,在调用Magento站点上的WebService时: 有时,Magento站点会发送错误的HTTP标头,特别是body-size标头,指示实际上比其实体大小更大。例如,它可能会说body-size = 1000,但实体仅由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网站,也无法修复由此引起的任何问题(这是第三方网络服务器)。
是否有什么我可以做以改变我的C#代码行为?我希望能够在它到达HTML body结束标签时强制其停止,并忽略这种情况下发生的异常。

这显然是一个需要Magento核心团队解决的bug,但这并不能直接帮助你。相关链接:https://dev59.com/d2nWa4cB1Zd3GeqPzlvF - benmarks
是的,这个 bug 真的很烦人 - 我正在寻找一种方法来忽略这个问题并继续阅读正文。 - JK.
2个回答

0

我不确定这样做是否有效,但你尝试将代码放入 try / catch 块并忽略异常吗?结果是否为 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");
}

0

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

基本上将API网址从:
domain.com/index.php/api/v2_soap/index/wsdl/1

更改为:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接