0

SoapHttpClientProtocol クラスを使用して SOAP 呼び出しを行う ASP.NET Web アプリケーションを IIS で実行しています。ここ数日で、いくつかの XP マシンが、SOAP サービスの呼び出し時にタイムアウト エラーを報告し始めました。

テスト アプリからのスタック トレース:

System.Net.WebException: The operation has timed out
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at TestWS.localhost.Service1.HelloWorld() in C:\Prototypes\TestWS\Web References\localhost\Reference.cs:line 78
   at ASP.default_aspx.__Renderform1(HtmlTextWriter __w, Control parameterContainer) in c:\Inetpub\wwwroot\TestWS\Default.aspx:line 17

TCP/Trace と Wireshark を使用すると、リクエストのヘッダーは送信されているが、コンテンツは送信されていないことがわかります。ただし、コンテンツ長の HTTP パラメータは正しく、コンテンツ ストリームがフラッシュされていないかのようです。

Microsoft の更新プログラムがこの問題の原因であると思われます。KB970430KB971737KB968389の可能性があります。この問題は、IIS 5.x (IIS の XP バージョン) に限定されているようです。

4

1 に答える 1

0

更新: これは、Web サーバー上で実行され、Web サーバーから SOAP サーバーへの HTTP 接続のオンザフライ チェックを実行する ESET アンチウイルスの問題であることが判明しました。

完全な説明: 記録として、これは .NET での HTTP プロトコル処理の欠陥です。シナリオは次のとおりです。

クライアントは HTTP POST のヘッダーを送信します。

POST /WS/Test.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603) 
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://testuri.org/HelloWorld"
Host: loadtest-app
Content-Length: 288
Expect: 100-continue
Connection: Keep-Alive

Expect: 100-Continue のため、コンテンツは送信されません。サーバーは次のように応答します。

HTTP/1.1 100 Continue

この時点で、クライアントは応答しません。これに対する回避策は、100-continue を無効にすることです。これにより、基本的にリクエスト ヘッダーとコンテンツが 1 つのチャンクで送信されるようになります。これは、web.config で次のように行うことができます。

<system.net>
   <settings>
      <servicePointManager expect100Continue="false"/>
   </settings>
</system.net>

ただし、クライアント側のトレース ログもオンに切り替えると、HTTP ヘッダーで CR の後に LF が続く必要があることを示すプロトコル例外がスローされます。.Net ネットワーク ロジックのどこかに壊れやすいコードがあるようです。要約すると、これは IIS 5.1 (XP で実行されるバージョン) の ASP.NET のみの問題です。

于 2009-12-18T10:16:52.410 に答える