我已经编写了一个自定义的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次。
我怀疑这种失败与用户单击链接以多次启动上述代码(这将为他们提供多个下载对话框),然后取消其中一些有关。话虽这么说,但我希望连接两端都能正常关闭。
如何证明此错误的确切原因?我试图启用像Why don't trace listeners log custom handler traffic?这样的.NET跟踪,但是无法使其正常工作。
但是,我发现我已启用IIS跟踪来记录失败的请求。故障再次发生,并且该日志中没有任何内容。
我可以启用其他任何跟踪功能吗?
我接下来尝试的是
if (context.Response.IsClientConnected)
{
context.Response.Flush();
context.Response.Close();
}
else
{
LogMessage("Client has disconnected before flush was called", Severity.Information);
}
但这没什么区别。尽管我猜想原因是客户端在下载过程中(而不是在调用flush之前)断开了连接。
最佳答案
取出Flush()
和Close()
调用。您真的不需要它们。处理程序完成后,它将退出,并且ASP.NET将处理关闭请求。
此外,在将内容流式传输到客户端时(将部分内容添加到响应流中以块形式),应使用Flush()
。您无需将其与TransmitFile()
一起使用。
关于c# - HttpContext抛出HttpException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5533068/