为什么我的asp.net应用程序抛出ThreadAbortException?

时间:2008-08-15 17:02:45

标签: asp.net multithreading

自我解释的问题。

为什么即使没有任何错误,这件事也会冒泡进入我的尝试?

为什么它会在我的日志中显示数百次?

我知道这是一个新问题,但是如果这个网站要获得搜索排名并用新手绘制,我们就要问他们

5 个答案:

答案 0 :(得分:19)

这可能来自Response.Redirect调用。请查看此链接以获取解释:

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(在大多数情况下,调用Response.Redirect(url,false)修复了问题)

答案 1 :(得分:7)

ThreadAbortException的最常见原因是调用Response.End, Response.Redirect, or Server.Transfer。 Microsoft发布了一些建议的函数,而不是这些函数。

答案 2 :(得分:1)

正如其他人所说,当你调用Response.End()时会发生这种情况(当你调用Response.Redirect而不传递false作为第二个参数时会发生这种情况)。这是按设计工作的;通常,如果您调用Response.Redirect,则希望重定向立即发生。有关更多信息,请参阅此处:

Response.Redirect and the ThreadAbortException

答案 3 :(得分:0)

知道(至少)有三个内部使用Thread.Abort的API,我想更实际地回答一下,如何解决该怎么做。

对于我们来说,这个错误开始被突然记录下来。改变了什么?我们修复了一些处理站点地图的数据库程序中的错误。

log4net日志显示X-Forwarded-For标题(我们落后于NLB)是Googlebot的IP地址66.249.78.x,这加强了我对网站地图变更的理论,导致Google更加积极地寻找网站图像。

首先要找出为什么只有Googlebot能够导致此问题。没有其他客户端触发任何使用Response.Redirect或其他任何代码路径的代码路径。

因此,在HttpApplication.Error处理程序中,我添加了一些代码来记录包含所有标头的额外详细输出,并且HttpResponseHttpContext中的大多数数据都用于记录。

这让我看到问题是Googlebot正在使用iPhone用户代理字符串并配备了这个字符串,我能够在代码库中搜索“iPhone”并提出:

private void CheckIPhoneAccess() { ... }

并使用重定向。

该怎么办?

好吧,对于这个老旧的代码库,不值得对所有Response.Redirect调用进行复制修补,因此我将降低应用程序ThreadAbortException的日志记录级别。

我将改变Googlebot的移动抓取工具的行为,因为它只会在第一次点击时重定向,然后它会读取一个Cookie, 会导致我们网站为移动设备提供的“谎言”。显示图像。 Googlebot似乎没有缓存该Cookie。

这不完美,但该网站将被重建。可能是另一个团队使用Scala或其他东西,所以实际上,我认为这是一个不错的选择。我将添加评论,稍后可能会重新审视该问题,构建一个Response.SafeRedirect扩展,其中包含此建议:

Why Response.Redirect causes System.Threading.ThreadAbortException?

答案 4 :(得分:0)

为什么Response.Redirect会给出此异常的原因是asp.net在内部使用Thread.Abort()实现此API。调用此方法时,抛出一个特殊的ThreadAbortException。此异常不会被任何catch块吞噬。它将在每个catch块的末尾重新抛出。