23

这是一个不言自明的问题:

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

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

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

4

5 回答 5

20

这可能来自 Response.Redirect 调用。检查此链接以获取说明:

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

(在大多数情况下,调用 Response.Redirect(url, false) 可以解决问题)

于 2008-08-15T17:11:32.213 回答
7

ThreadAbortException 最常见的原因是调用Response.End、Response.Redirect 或 Server.Transfer。Microsoft 已发布了一些建议的函数,应使用这些函数代替这些函数。

于 2008-08-15T17:12:45.283 回答
1

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

Response.Redirect 和 ThreadAbortException

于 2008-11-05T00:40:07.537 回答
0

知道有(至少)三个内部使用的 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?

卢克

于 2013-08-29T09:30:06.490 回答
0

The reason of why Response.Redirect will give this exception is asp.net internally implement this API with Thread.Abort(). When this method is called, a special ThreadAbortException is thrown.This exception wont be swallowed by any catch block. It will be re thrown at the end of each catch block.

于 2013-08-29T09:53:49.130 回答