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

Moh*_*awi 13 .net

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

我怎样才能避免这种情况,或至少处理它,使用Thread.ResetAbort()在这种情况下是否有用?

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

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*Joe 12

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

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

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

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

我建议你:

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

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

  • httpRuntime.executionTimeout是我的场景中的罪魁祸首 - 谢谢! (2认同)