5

最近、SOAP::Lite を使用して作成された Web サービスにアクセスする必要が生じました。WSDL がなく、適切なデータ型が返されないなどの理由で使用するのは非常に面倒です。そのため、提供されたサンプル コードを使用して開始しました。

最初から問題が発生し、リクエストがタイムアウトしました。時々頻繁に、時にはめったにありませんが、完全に問題がないわけではありません。Fiddler を使用してトラフィックを盗聴し、検索した後、SOAP::Lite にバグがあり、UTF-8 でエンコードされたデータを処理するときにヘッダー Content-Length を台無しにしたようです。私の分析では、クライアントが追加のデータ (Content-Length) を待っている間にタイムアウトが発生し、サーバーはそれが完了した (実際のデータ) ことを示しているため、これは妥当と思われます。

したがって、この誤ったヘッダー フィールドに対抗する方法と、次のいずれかが必要です。

  1. 正しい Content-Length または
  2. Content-Length に一致するようにペイロードをパディングします

問題は、解析が開始される前に Invoke() が最終的に IoException または WebException をスローするため、SoapExtension またはその他の変更を使用する機会がないことです。また、WS は私のものではなく、ほとんど変更できないと思います。

また、SoapHttpClientProtocol.GetWebResponse() をオーバーライドして非同期リクエストを実行しようとしましたが、HttpWebRequest.EndGetResponse() を呼び出す前に ResponseStream を取得できず、常に例外がスローされたため、それも役に立ちませんでした。

私がこれにどのようにアプローチできるか、誰かが考えていますか?

更新: 今では WCF も試しましたが、MSDN でこの投稿に出くわしました- 答えはあまり高揚しません。基本的に、これは配管の奥深くで発生し、ユーザー コードからアクセスできません。私の最善の策は、Fiddler スクリプトを使用して Content-Length ヘッダーを修正することです。この WS は HTTPS でのみ利用できるため、おそらく簡単ではありません。

/ダン

4

0 に答える 0