【问题标题】:Why is my asp.net application throwing ThreadAbortException?为什么我的 asp.net 应用程序抛出 ThreadAbortException?
【发布时间】:2023-03-21 04:54:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net multithreading


    【解决方案1】:

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

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

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

    【讨论】:

    • 请注意,上面的链接已损坏
    • Eric 的回答是正确的,但是你应该知道传入 false 参数意味着当前线程没有中止,即 Response.Redirect 之后的代码将被运行。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      Response.Redirect and the ThreadAbortException

      【讨论】:

        【解决方案4】:

        知道有(至少)三个 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 之类的,所以实际上,我认为这是一个不错的选择。我将添加 cmets,稍后可能会重新讨论该问题,构建一个封装此建议的 Response.SafeRedirect 扩展:

        Why Response.Redirect causes System.Threading.ThreadAbortException?

        卢克

        【讨论】:

        • 需要添加,HaveSeenIPhonePromo cookie 从未被设置,因此 Googlebot-Mobile 不断被重定向。这是根本原因。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 2016-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          相关资源
          最近更新 更多