【问题标题】:What might cause ThreadAbortException when using HttpWebRequest.GetResponse()使用 HttpWebRequest.GetResponse() 时可能导致 ThreadAbortException 的原因
【发布时间】:2008-10-14 16:41:44
【问题描述】:

由于这种情况,我生活在噩梦中,我有一个 HttpWebRequest.GetResponse,它不断给我一个 ThreadAbortException,导致整个应用程序崩溃。

在这种情况下,使用 Thread.ResetAbort() 如何避免或至少处理它?

这里有一个粗略的代码示例来解释更多:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();

现在上面的最后一行抛出 ThreadAbortException,这可能是因为请求超时,这很好,但我不想在我的 ASP.NET 2.0 应用程序中获得 ThreadAbortException,因为它会杀死它。 ThreadAborException 不能用 try/catch 捕获,唯一的处理方法是使用 Thread.ResetAbort(),它也有自己的坏影响,它会让线程保持活动状态,只有上帝知道多久。

【问题讨论】:

  • 尝试在第 2 行捕获 System.Exception 并查看抛出的 ex 类型。
  • 可以捕获 ThreadAbortException,你只需要正确处理它。完成后,ResetAbort() 是正确的做法。请参阅msdn.microsoft.com/en-us/library/… 了解更多信息。

标签: .net


【解决方案1】:

从您所说的看来,您似乎是在处理对 ASP.NET 应用程序的传入请求的过程中向外部资源发出传出 WebRequest。这里有(至少)两个相关的超时:

  • WebRequest.Timeout(默认 100000 毫秒 = 100 秒)指定执行传出 WebRequest 的超时时间。如果此超时到期,您应该得到一个 WebException - 所以这不是您的问题。

  • 处理传入请求的 HttpRuntime 有一个执行超时:根据MSDN 的默认值对于 .NET 2.0 或更高版本是 110 秒,对于 .NET 1.x 是 90 秒。当此超时到期时,您将收到 ThreadAbortException。看起来这就是正在发生的事情。

在 .NET 1.x 中,您会期望这一点,因为默认的 HttpRuntime executionTimeout 小于 WebRequest.Timeout。在 .NET 2.0 中,如果您在发出传出 WebRequest 之前已经花费了超过 10 秒(例如,如果您在同一个传入请求中有多个传出 WebRequest),那么您会期望使用默认超时。

我建议你:

  • 减少传出请求的 WebRequest.Timeout,并处理 WebException,或

  • 如果传出请求确实需要那么长时间,则增加 httpRuntime 执行超时,如 MSDN 中所述。

【讨论】:

  • httpRuntime.executionTimeout 是我场景中的罪魁祸首 - 谢谢!
【解决方案2】:

我在使用 Response 时遇到了这个问题。查看这篇文章了解一些解决方法。 http://support.microsoft.com/kb/312629

还可以查看 WebException 和 Remarks 部分中的此 MSDN 文档。 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx

这个异常可以被捕获...如果您无法检测到正确的异常,您应该尝试捕获一个一般异常(system.Exception),然后堆栈跟踪应该会告诉您具体的类型(HttpException、WebException、等)实际捕捉。

【讨论】:

    【解决方案3】:

    我们的应用程序一直抛出 ThreadAbortException 的 b/c Response.Redirect("url") 调用。该应用程序从未关闭,很可能是因为异常在某个时候被捕获并保持活动状态。

    顺便说一句, Response.Redirect("url",false) 将防止 Response 因异常而终止。 Andrew 的帖子链接到 Response 类的不同用途的类似解决方法。

    【讨论】:

    • 这是准确的(Response.Redirect(url) 调用 Response.End 会引发 ThreadAbortException)但与 OP 的情况无关。
    【解决方案4】:

    我已经看到了 Andrew 和“ForCripesSake”列出的两个问题。

    您的 ThreadAbortException 的另一种可能性是在服务器端的页面请求生命周期之外运行的任何代码,例如 HttpModules 和 HttpHandlers。模块或处理程序中抛出的任何异常都不会进入 ASP.Net 中默认的未处理异常机制,并且可能导致线程死亡。

    根据这篇文章,有一些异常在 ASP.net 或一般 CLR 中无法轻松处理:

    Reliability Best Practices

    不确定它是否适用于您在问题中列出的客户端代码,但可能是相关的。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 2016-04-15
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2020-02-22
      相关资源
      最近更新 更多