不言自明的问题。

为什么即使没有任何问题,这个东西也会冒泡到我的 try catch 中?

为什么它会在我的日志中出现数百次?

我知道这是一个新手问题,但如果这个网站想要获得搜索排名并吸引新手,我们就必须问他们

有帮助吗?

解决方案

这可能来自 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 处理程序中,我添加了一些代码来记录所有标头的额外详细输出,以及 HttpResponseHttpContext 喷出日志。

这让我发现问题在于 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 块吞没。它将在每个 catch 块的末尾重新抛出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top