我已经编写了一个自定义的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/

10-12 15:58