画像を処理するためのかなり複雑な httphandler があります。基本的に、要求された任意のサイズで画像の任意の部分をストリーミングします。一部のクライアントは、このハンドラーを問題なく使用します。しかし、問題が発生する場所が 1 か所あり、開発環境でも問題が発生しています。
何が起こるかというと、クライアントが一部のリクエストで何も受信しないということです。したがって、リクエスト 1 と 2 は問題ありませんが、リクエスト 3 と 4 は決して終了しません。
- デバッグ中に、サーバーの準備が整い、リクエストを完了したことがわかります。
- ただし、クライアントはまだ結果を待っています (fiddler2 でデバッグすると、応答が受信されないことが示されます)。
画像をストリーミングするために使用するコードは次のとおりです。
if (!context.Response.IsClientConnected)
{
imageStream.Close();
imageStream.Dispose();
return;
}
context.Response.BufferOutput = true;
context.Response.ContentType = "image/" + imageformat;
context.Response.AppendHeader("Content-Length", imageStream.Length.ToString());
if (imageStream != null && imageStream.Length > 0 && context.Response.IsClientConnected)
context.Response.BinaryWrite(imageStream.ToArray());
if (context.Response.IsClientConnected)
context.Response.Flush();
imageStream.Close();
imageStream.Dispose();
imageStream は、イメージのコンテンツを含む MemoryStream です。
response.Flush() を呼び出した後、さらにクリーンアップを行い、要約をイベント ログに書き込みます。
また、メモリ内で使用するオブジェクトが非常に大きくなるため、すべてのリクエストの後に GC.Collect() を呼び出します。それが良い習慣ではないことはわかっていますが、問題が発生する可能性はありますか?
リクエストを返さないという問題は、IIS 5 (Win XP) と IIS 6 (Win 2003) の両方で発生します。.NET Framework v2 を使用しています。