我写了一个自定义的 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 次上述代码。
我怀疑此失败与用户单击链接以多次启动上述代码(这将给他们提供多个下载对话框)然后他们取消其中一些有关。话虽如此,如果是这样的话,我会期望连接在两端优雅地关闭。
How can I prove the exact cause of this error? I have tried to enable .NET tracing like this Why don't trace listeners log custom handler traffic? but couldn't get it to work.
What I found though is that I have enabled IIS tracing to log failed requests. The failure occurred again, and NOTHING was in that log.
Any other tracing I can enable for instance?
The next thing I tried was this,
if (context.Response.IsClientConnected)
{
context.Response.Flush();
context.Response.Close();
}
else
{
LogMessage("Client has disconnected before flush was called", Severity.Information);
}
But that didn't make any difference. The reason though I guess is that the client disconnected while the download was taking place, not before flush was called.