使用HttpWebRequest.GetResponse()时可能导致ThreadAbortException的原因

时间:2008-10-14 16:41:45

标签: .net

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

如果使用Thread.ResetAbort()在这种情况下有用,我怎么能避免这种情况,或者至少处理它呢?

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

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

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

4 个答案:

答案 0 :(得分:12)

根据您的说法,您似乎正在从处理对ASP.NET应用程序的传入请求中向外部资源发送传出WebRequest。这里有(至少)两个超时:

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

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

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

我建议你:

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

  • 如果传出请求确实需要那么长时间,请按照MSDN中的说明增加httpRuntime执行超时。

答案 1 :(得分:2)

使用Response时出现此问题。查看本文以获取一些解决方法。 http://support.microsoft.com/kb/312629

另请参阅WebException和备注部分中的此MSDN文档。 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx

可以捕获此异常...如果您在检测正确的异常时遇到问题,您应该尝试捕获一般异常(system.Exception),然后堆栈跟踪应该告诉您特定的类型(HttpException,WebException,等)真正抓住。

答案 2 :(得分:0)

我们的应用程序一直抛出ThreadAbortException的b / c Response.Redirect(“url”)调用。该应用程序从未关闭,很可能b / c异常在某个时刻被捕获并保持活跃。

顺便说一句,Response.Redirect(“url”,false)将阻止响应以异常终止。 Andrew的帖子链接到类似的变通类的不同用途的变通方法。

答案 3 :(得分:0)

我已经看到安德鲁和“ForCripesSake”列出的两个问题。

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

根据这篇文章,有一些例外情况无法在ASP.net或CLR中轻松处理:

Reliability Best Practices

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

希望有所帮助!