提问人:DevelopingChris 提问时间:8/16/2008 最后编辑:Seyedraouf ModarresiDevelopingChris 更新时间:1/18/2020 访问量:12889
为什么我的 asp.net 应用程序会引发 ThreadAbortException?
Why is my asp.net application throwing ThreadAbortException?
问:
这是一个不言自明的问题:
为什么即使没有任何问题,这东西也会冒泡在我的尝试捕获中?
为什么它出现在我的日志中数百次?
我知道这是一个新手的问题,但如果这个网站要获得搜索排名并吸引新手,我们必须问他们
答:
这可能来自 Response.Redirect 调用。查看此链接以获取说明:
http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx
(在大多数情况下,调用 Response.Redirect(url, false) 可以解决问题)
评论
ThreadAbortException 的最常见原因是调用 Response.End、Response.Redirect 或 Server.Transfer。Microsoft 发布了一些建议的函数,应该使用这些函数来代替这些函数。
正如其他人所说,当您调用 Response.End() 时会发生这种情况(当您调用 Response.Redirect 而不将 false 作为第二个参数传递时会发生这种情况)。这是按设计工作的;通常,如果调用 Response.Redirect,则希望立即进行重定向。有关详细信息,请参阅以下内容:
Response.Redirect 和 ThreadAbortException
知道(至少)有三个 API 在内部使用,我想用更实际的术语来回答,如何弄清楚该怎么做。Thread.Abort
对我们来说,这个错误突然开始被记录下来。发生了什么变化?我们修复了某些处理站点地图的数据库过程中的一个错误。
log4net 日志显示 X-Forwarded-For 标头(我们在 NLB 后面)是 Googlebot 的 IP 地址 66.249.78.x,这支持了我关于站点地图更改的理论,该更改导致 Google 更积极地抓取我们的网站以查找图像。
第一件事是找出为什么只有Googlebot能够导致这个问题。没有其他客户端触发任何代码路径使用或其他任何内容。Response.Redirect
因此,在处理程序中,我添加了一些代码来记录所有标头的更详细的输出,以及 和 中的大部分数据。HttpApplication.Error
HttpResponse
HttpContext
这让我看到问题在于 Googlebot 正在使用 iPhone 用户代理字符串,并且有了它,我能够在代码库中搜索“iPhone”并提出:
private void CheckIPhoneAccess() { ... }
这使用重定向。
怎么办?
好吧,对于这个陈旧的代码库,不值得对所有调用进行回修,因此我将降低应用程序的日志记录级别。Response.Redirect
ThreadAbortException
我将更改 Googlebot 的移动抓取工具的行为,这不会导致关于我们网站向手机提供的内容的“谎言”,因为它仅在第一次点击时重定向,随后它会读取 cookie 并显示图像。Googlebot 似乎没有缓存该 Cookie。
它并不完美,但该网站将被重建。可能是另一个使用 Scala 或其他东西的团队,所以实际上,我认为这是一个不错的选择。我将添加评论,稍后可能会重新访问该问题,构建一个包含此建议的扩展:Response.SafeRedirect
为什么 Response.Redirect 会导致 System.Threading.ThreadAbortException?
卢克
评论
Response.Redirect 给出此异常的原因是 asp.net 使用 Thread.Abort() 在内部实现此 API。调用此方法时,将引发特殊的 ThreadAbortException。此异常不会被任何 catch 块吞噬。它将在每个捕获块的末尾重新抛出。
评论