1

次のコード行を含む ASP.NET ページがあるとします。

while (true)
{
   byte[BUFFER_SIZE] buffer;
   // Fill buffer with pseudo data
   Response.OutputStream.Write(buffer, 0, buffer.Length);
   Response.Flush();
}

次のコード行を含む、上記のページのテスト アプリケーションもあります。

while (readBytes != 0)
{
   byte[BUFFER_SIZE] buffer;
   readBytes = stream.Read(buffer, 0, buffer.length)
}

実際に巨大なファイルを読み取る代わりに、その場でランダムなバイナリ データを生成してクライアントに転送しようとしたところ、問題なく動作しました。次に、ASP.NET ページからバイトを読み取るだけで何もせず、ASP.NET ページによって接続が閉じられる (ダウンロードが終了する) まで次のバイトを読み取るクライアントを作成しました。ダウンロードをいつ終了するかについて、ASP.NET ページで時間ベースの設定を使用しました (これはストレス テストです)。

したがって、IIS 7.0 と ASP.NET が行っているのは、一定期間 (つまり 1 時間) のデータのストリーミングです。このページで 100 の同時クライアントを開始し、平均ダウンロード速度は 1 時間で 250 KB/秒でした。約 45 分間はすべて問題ありませんでしたが、IIS は突然、クライアント側で次のエラー コードを表示してすべての接続を閉じます。

トランスポート接続からデータを読み取れません: 接続が閉じられました。

IIS 経由で大量のバイナリ データを転送することだと思います。IIS 7.0 には、私のストレス テストによってトリガーされる構成が必要ですが、どの構成でしょうか。

4

1 に答える 1

1

答えは面白いですが、なぜ私がこの質問をしたのか、そしてどのように答えを見つけたのかを確認しましょう。

問題に遭遇した後、私はWebを検索し、同様の質問に答えがないことを発見しました。私の経験では、他の誰も尋ねていない質問をしたり、答えられる機会のない同様の質問がたくさんある場合、質問に何か問題がありますが、その時点では考えていませんでした。切断された後、ストレステストのパラメーターを変更し、テストの終了時にクライアントが切断されていることを確認しました(テストは時間ベースで設計されていると述べました)。確かに私のコードのどこかで、リクエストをシャットダウンするときに間違ったことをしていました。.NETのどこでも接続を閉じ、リソースを解放し、ASP.NETのオブジェクトでdisposeを呼び出す必要があるにもかかわらず、このメソッドをまったく呼び出さないでください。

Response.Close()

ASP.NETページでの作業が完了したら、IISに残りの作業を任せる必要があります(実行パスにコードを残すようにします)。何かがおかしいと思います。asp.netページスコープで公開するべきではないかもしれません。あるいは、メソッド名はResponse.Disconnect()クリーンアップコードに非常に似ているため、次のようなものにする必要があります。

はい私はクライアントを切断することによって自分自身を蹴っていましたResponse.Close()

そのコードを削除した後はすべて問題ありませんが、マシンの空きRAMが十分でない場合は、RAMを追加することでこれを克服できるため、このエラーが発生します。

An existing connection was forcibly closed by the remote host.
于 2010-10-10T13:24:20.557 に答える