IHttpModule.BeginRequest触发2X,Application_BeginRequest触发1X

时间:2010-02-02 03:03:42

标签: asp.net httpmodule

我正在运行VS 2008和.NET 3.5 SP1。

我想在我的ASP.NET应用中的HttpModule中实现点击跟踪。我想,很简单。但是,BeginRequest的{​​{1}}事件会针对每个网页点击两次。该网站现在非常简单......没有安全性,只需要一些数据库工作。应该每页登录一行。为什么这个事件会发射两次?

此外,HttpModule在第一次运行时(从关闭的Web浏览器)实际触发第一页时触发的次数不同... ...当我点击数据库提供动态时3次页面的数据,对于未命中数据库的页面,只有1次。无论我是否触摸数据库,它都会在第一个页面之后的每个页面触发2次。

有趣的是,IHttpModule.BeginRequest(在Application_BeginRequest中)始终只会触发一次。

以下是代码:

Global.asax

7 个答案:

答案 0 :(得分:3)

答案可能为时已晚,但对其他人有用。我遇到了同样的问题。每个请求触发两次BeginRequest事件。我调试了代码并意识到实际资源请求的第一个触发器,但第二个是“favicon.ico”请求的结果。在BeginRequest事件开始时,对favicon.ico请求的简单检查会消除该方法的第二次执行。

public void Application_BeginRequest(object sender, EventArgs e) {
   HttpApplication app = (HttpApplication)sender;
   HttpContext ctx = app.Context;

   if (ctx.Request.Path == "/favicon.ico") { return; }

答案 1 :(得分:1)

这很有趣。我从母版页中删除了对CSS文件的引用,对于某些浏览器,我在HttpModule中的重复命中次数减少了(如建议的那样),但我仍在重复。我已经安装了6个浏览器,我之间会有一些变化。

作为参考,这是我为此测试插入浏览器的URL:

http://localhost/BluHeron

default.aspx被设置为起始页面,实际上是为上述URL返回的。我正在使用HttpRequest.RawUrl报告用户点击的页面。具体来说,我正在拆分RawUrl字符串,只报告字符串数组中的最后一项(参见代码)。

  • 每个浏览器都按预期报告命中default.aspx(RawUrl = /BluHeron/default.aspx)。
  • 6个浏览器中的4个也报告了BluHeron(RawUrl = / BluHeron)。
  • 6个浏览器中的3个也在数据库中记录了一个空白(RawUrl = / BluHeron /)。

有几种方法可以准确报告有多少人在点击哪些页面。

  1. 仅从数据库中选择实际列出我的一个页面的行(忽略/ BluHeron和空白)
  2. 只需在global.asax文件中使用Application_BeginRequest(似乎每次点击时始终只调用一次)
  3. 弄明白
  4. 所以,即使数据库中的数据很糟糕,我也可以选择获得好的报告。但是,我宁愿不在数据库中使用垃圾,也不想了解这里发生了什么。

    感谢大家的期待!

答案 2 :(得分:1)

这很晚,但遇到了同样的问题。在我们的例子中,这是由于匿名请求首先返回每个RFC的401。第二个请求进行身份验证。

答案 3 :(得分:1)

"默认文件" IIS的一部分似乎引发了第二个BeginRequest事件。如果您确定两个事件处理程序中Request.Path的{​​{1}}相同,并且您的网址以斜杠结尾,请尝试添加网址重写规则以快捷方式"默认文档&#34 ;处理

答案 4 :(得分:0)

一种可能性是,您可能没有考虑其他请求。例如,假设您的ASPX页面引用了一些图像或CSS文件。如果这些请求通过ASP.NET管道,那么您的模块将被调用,并且它们将被注册为命中。

另外,当你说IHttpModule.BeginRequest时,你的意思是在IHttpModule.Init()中你是否正在连接HttpApplication.BeginRequest?如果是这样,那么我上面提到的原因可能仍然适用。

答案 5 :(得分:0)

我们使用

解决了这个问题
HttpContext.Current.ApplicationInstance.CompleteRequest();

这可以防止你看到的两次火灾。

答案 6 :(得分:-1)

在Visual Studio 2013及更高版本中禁用Browser Link,这会导致第二个请求。

VS Snapshot

从Visual Studio运行应用程序时会发生这种情况。