5

C# ASP.NET MVC を使用して、Magento サイトで Web サービスを呼び出す場合:

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 サイトを変更したり、これを引き起こしている問題 (サードパーティの Web サーバー) を修正したりすることはできません。

自分の C# コードの動作を変更するためにできることはありますか? 体の終わりに達したときに何とか強制的に停止させ、この場合が発生した場合はこの例外を無視できるようにしたいと思います

4

2 に答える 2

0

ここから解決策を試してください(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

于 2016-03-24T13:19:20.037 に答える
0

これが機能するかどうかはわかりませんが、コードを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");
}
于 2013-01-02T20:33:21.997 に答える