为啥刷新浏览器时 Application_BeginRequest() 会触发两次?

Posted

技术标签:

【中文标题】为啥刷新浏览器时 Application_BeginRequest() 会触发两次?【英文标题】: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 会触发数百次。 【参考方案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 管道的东西的引用,例如动态生成的图像或类似的东西?

【讨论】:

以上是关于为啥刷新浏览器时 Application_BeginRequest() 会触发两次?的主要内容,如果未能解决你的问题,请参考以下文章

网页编码格式为UTF-8,文件保存格式也是UTF-8,为啥我用浏览器浏览时是乱码?刷新一下就显示正常!

为啥.cshtml更改后刷新页面不更新

为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?

js引入时第一次的为啥没加载,你刷新一下他就加载了?

为啥要撤销访问令牌?

为啥刷新一下页面SessionID会变