【问题标题】:Why does Application_BeginRequest() fire twice when refreshing browser?为什么刷新浏览器时 Application_BeginRequest() 会触发两次?
【发布时间】:2009-07-16 18:51:12
【问题描述】:

我在 Global.asax 文件(在 ASP.NET MVC 应用程序中)中观察到 Application_BeginRequest 事件的一些真正令人困惑的行为。通过调试器运行时,如果我刷新浏览器 (IE7),此事件会触发两次。如果我单击链接或以其他方式手动请求页面,它会按预期触发一次。

为什么刷新会导致 BeginRequest 触发两次?

我在一个全新的 MVC 项目中观察到这一点,并在 Global.asax.cs 中添加了以下内容

protected void Application_BeginRequest() { 
    //executed twice
}

对于上下文,我试图在此事件期间向 HttpContext.Current.Items 集合添加一个新对象,因此它将在整个请求过程中持续存在。显然,我不希望对于一个刷新请求,这种情况发生两次!

【问题讨论】:

  • 您是否正在执行任何类型的 URL 重定向?
  • 哇; 2倍太多了吗?在调试时,Application_BeginRequest 会触发数百次。

标签: asp.net


【解决方案1】:

你确定它真的是对同一个 URL 的 2 个请求吗?我认为第二个可能是一些动态的 JS、CSS 或图像文件。尝试使用 Fiddler 或通过查看调试器中的 HttpContext.Current.Request.Uri 找出答案

【讨论】:

  • 宾果游戏!我没有意识到这会触发其他内容文件。似乎刷新与其他请求的奇怪之处在于 IE 在刷新时请求所有内容(url、css、js 等),而单击链接或重新输入 url 它正在缓存除实际 url 之外的所有内容请求...
【解决方案2】:

前段时间让我吃惊的是,如果你的 html 中有一个没有正确图像路径的 img 标签,一些浏览器会向原始页面发出请求。 Here is a related blog post.

【讨论】:

    【解决方案3】:

    我不确定为什么会发生这种情况,但我发现创建 BaseController 类并让我的所有控制器都继承自它更容易。更改构造函数以将您的项目添加到 HttpContext。

    【讨论】:

    • 好主意。这发生在我身上,现在看来它必须是我的解决方案。
    【解决方案4】:

    您的 HTML 中是否有对也通过 ASP.NET 管道的东西的引用,例如动态生成的图像或类似的东西?

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      相关资源
      最近更新 更多