Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用HttpWebRequest.GetResponse()时,什么可能导致ThreadAbortException_.net - Fatal编程技术网

.net 使用HttpWebRequest.GetResponse()时,什么可能导致ThreadAbortException

.net 使用HttpWebRequest.GetResponse()时,什么可能导致ThreadAbortException,.net,.net,由于这种情况,我生活在噩梦中,我有一个HttpWebRequest.GetResponse,它不断给我一个ThreadAbortException,这会导致整个应用程序崩溃 在这种情况下,使用Thread.ResetAbort()会有用吗?我如何避免,或者至少处理它 下面是一个粗略的代码示例,以进一步说明: HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/"); HttpWebResponse

由于这种情况,我生活在噩梦中,我有一个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(),它也有它自己的不良影响,它将使线程保持活动状态,并且只有天知道会持续多长时间。

我在使用Response时遇到了这个问题。查看本文,了解一些解决方法

还可以在WebException和备注部分查看此MSDN文档


可以捕获此异常。。。如果您在检测正确的异常时遇到问题,您应该尝试捕获一个常规异常(system.exception),然后堆栈跟踪将告诉您实际捕获的特定类型(HttpException、WebException等)

我们的应用程序始终抛出线程异常 重定向(“url”)调用。应用程序从未关闭,很可能b/c异常在某个点被捕获并保持活动状态


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

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

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

根据本文所述,在ASP.net或CLR中,有几个异常通常不容易处理:

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


希望有帮助

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

  • 超时(默认10000ms=100s)指定执行传出WebRequest的超时时间。如果这个超时过期,你应该得到一个WebException,所以这不是你的问题

  • 处理传入请求的HttpRuntime有一个执行超时:对于.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,或

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


尝试捕获第二行的系统异常,然后查看抛出的ex类型。您可以捕获ThreadAbortException,只需正确处理它即可。完成后,ResetAbort()是正确的操作。有关更多信息,请参阅。这是准确的(Response.Redirect(url)调用Response.End,引发ThreadAbortException),但与OP的情况无关。httpRuntime.executionTimeout是我场景中的罪魁祸首-谢谢!