接受的方法可以防止“远程主机关闭连接”异常

时间:2011-04-15 15:40:13

标签: c# .net asp.net exception exception-handling

经常获得以下异常,该异常是由用户启动下载引起的,因此失败(或被取消):

  

错误消息:远程主机已关闭   连接。错误代码是   0x80072746。堆栈跟踪:at   System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore(字节[]   status,Byte []标头,Int32   keepConnected,Int32 totalBodySize,   Int32 numBodyFragments,IntPtr []   bodyFragments,Int32 []   bodyFragmentLengths,Int32   doneWithSession,Int32 finalStatus,   布尔和放大器; async)at   System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse(布尔   isFinal)at   System.Web.Hosting.ISAPIWorkerRequest.FlushResponse(布尔   在

处的finalFlush)

我在互联网上搜索了and found an interesting article,但似乎没有明确的答案,因为这是阻止日志填满日志的最佳方式。

用户没有看到任何错误,并且在应用程序中没有实际问题,因为它仅在我自己的理解中发生(在用户取消下载或丢失连接的情况下)但是必须有一种方法可以防止这种情况发生。报告的例外。

我不想这么说但是我很想检查这个异常并且空闲阻止其屁股 - 但这让我感觉自己像个肮脏的程序员。

那么 - 阻止此异常填满邮箱的可接受方法是什么?

3 个答案:

答案 0 :(得分:8)

当您尝试向客户端发送响应但它们已断开连接时,会发生此错误。您可以通过在Response.Redirect上设置断点或者将数据发送到客户端的任何位置来验证这一点,等待Visual Studio命中断点,然后在IE中取消请求(使用位置栏中的x)。这应该会导致错误发生。

要捕获错误,您可以使用以下内容:

try
{
    Response.Redirect("~/SomePage.aspx");
    Response.End();
}
catch (System.Threading.ThreadAbortException)
{
    // Do nothing. This will happen normally after the redirect.
}
catch (System.Web.HttpException ex)
{
    if (ex.ErrorCode == unchecked((int)0x80070057)) //Error Code = -2147024809
    {
        // Do nothing. This will happen if browser closes connection.
    }
    else
    {
        throw ex;
    }
}

或者在C#6中,您可以使用异常过滤器来防止不得不重新抛出错误:

try
{
    Response.Redirect("~/SomePage.aspx");
    Response.End();
}
catch (System.Threading.ThreadAbortException)
{
    // Do nothing. This will happen normally after the redirect.
}
catch (System.Web.HttpException ex) when (ex.ErrorCode == unchecked((int)0x80070057))
{
    // Do nothing. This will happen if browser closes connection.
}

这是一个更好的调试体验,因为它会停止在语句中抛出当前状态的异常并保留所有局部变量而不是在catch块内的throw上。

答案 1 :(得分:3)

您无法阻止远程主机关闭任何内容。

在某些协议中,这是正常(或至少接受)说再见的方式。

因此,您必须处理此特定异常。

答案 2 :(得分:1)

从实际角度来看,通过死计算机或被杀死的网络会话取消下载没有任何问题,因此捕获远程主机关闭的异常是完全可以接受的。