カスタムhttpハンドラーを作成しました。これは、IHttphandlerを実装するクラスを作成することで実現しました。
そのクラスの中に、私はこのようなコードを持っています、
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + attachmentFileName);
context.Response.AddHeader("Content-Length", new FileInfo(downloadFile).Length.ToString());
context.Response.ContentType = GetMimeType(attachmentFileName);
context.Response.TransmitFile(downloadFile);
context.Response.Flush();
context.Response.Close();
ときどきこのようなエラーが発生しますが、
Exception HttpException The remote host closed the connection The error code is 0x800703E3
またはこれ、
Exception HttpException The remote host closed the connection The error code is 0x80070040
どちらの場合も、スタックトレースはこれです。
at System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect)
at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
at System.Web.HttpResponse.Flush(Boolean finalFlush)
at System.Web.HttpResponse.Flush()
これは本番環境で発生します。過去数日間を振り返ると、エラーが23回発生し、合計で上記のコードは497回呼び出されています。
この失敗は、ユーザーがリンクをクリックして上記のコードを複数回開始し(複数のダウンロードダイアログが表示される)、一部のコードをキャンセルしたことに関連していると思われます。そうは言っても、そのようなものであれば、両端で接続が正常に閉じることを期待していました。
このエラーの正確な原因をどのように証明できますか?このように.NETトレースを有効にしようとしました。トレースリスナーがカスタムハンドラトラフィックをログに記録しないのはなぜですか。しかし、それを機能させることができませんでした。
ただし、IISトレースを有効にして、失敗した要求をログに記録していることがわかりました。障害が再び発生し、そのログには何もありませんでした。
たとえば、他に有効にできるトレースはありますか?
次に試したのはこれでした
if (context.Response.IsClientConnected)
{
context.Response.Flush();
context.Response.Close();
}
else
{
LogMessage("Client has disconnected before flush was called", Severity.Information);
}
しかし、それは何の違いもありませんでした。私が推測する理由は、フラッシュが呼び出される前ではなく、ダウンロードが行われている間にクライアントが切断されたためです。