0

テスト目的で次のコードがあります

for( int i = 0; i < 5 ; i++ ) {   
   var url = "http://myserver.com/Warmup";
   var request = WebRequest.Create(url);
   using (WebResponse response = request.GetResponse()) {
       using (var stream = response.GetResponseStream()) {
           using (var reader = new StreamReader(stream)) {
               reader.ReadToEnd();
           }
       }
   }
}

Connection: Keep-AliveFiddler で実行すると、最初のリクエストのみにヘッダーがあることがわかります。

これは、サーバーがしばらく非アクティブになった後にアプリケーション プールをシャットダウンするようにプログラムされている IIS であり、そのプールのシャットダウンが最初の要求の後、次の要求の前に発生する場合、クライアントからの次の要求はConnection: Keep-Alive設定されていないため、keep-アライブは入りません。

Connection: Keep-Aliveが最初のリクエストでのみ送信され、それ以降のリクエストでは送信されないのはなぜですか?

4

2 に答える 2

1

HTTP/1.1 はデフォルトでキープアライブ接続を使用します。Connection: closeクライアントまたはサーバーは、ヘッダーを送信して、Keep-Alive 動作を望まないことを明示的に示す必要があります。

クライアントは、サーバーがサポートしているかどうか、または応答を返すConnection: Keep-Aliveかどうかをまだ知らないため、最初の要求でのみヘッダーが送信されます。サーバーがそのバージョンを使用して応答を送信することによってサポートしていることを確認すると、クライアントは冗長ヘッダーを安全に削除できることを認識します。HTTP/1.1HTTP/1.0HTTP/1.1

于 2013-12-17T17:42:46.647 に答える
-1

リクエストにTCP接続を使用しているためだと思います。ここで述べたように、サーバーは、実行中のすべてのリクエストを担当する 1 つの TCP 接続を作成します。

TCP は 3 ウェイ ハンドシェイクを使用するため、サーバーとクライアントは接続がまだ利用可能かどうかを常に認識しています。そのため、サーバーが接続を閉じるたびに、いわゆる FIN ビットをクライアントに送信して、クライアントが接続が確立されていないことを認識できるようにします。

webrequest を 5 回作成しますが、クライアントは既に要求を認識しています。これは、クライアントが最終的に接続を終了することを要求しない限り、TCP/IP プールで使用可能であり、接続を再利用できるためです。

このトピックに関するこのウィキペディアの記事で詳細を確認できます。

于 2013-05-27T11:45:43.493 に答える