我正在运行VS 2008和.NET 3.5 SP1。
我想在我的ASP.NET应用中的HttpModule
中实现点击跟踪。我想,很简单。但是,BeginRequest
的{{1}}事件会针对每个网页点击两次。该网站现在非常简单......没有安全性,只需要一些数据库工作。应该每页登录一行。为什么这个事件会发射两次?
此外,HttpModule
在第一次运行时(从关闭的Web浏览器)实际触发第一页时触发的次数不同... ...当我点击数据库提供动态时3次页面的数据,对于未命中数据库的页面,只有1次。无论我是否触摸数据库,它都会在第一个页面之后的每个页面触发2次。
有趣的是,IHttpModule.BeginRequest
(在Application_BeginRequest
中)始终只会触发一次。
以下是代码:
Global.asax
答案 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:
default.aspx被设置为起始页面,实际上是为上述URL返回的。我正在使用HttpRequest.RawUrl报告用户点击的页面。具体来说,我正在拆分RawUrl字符串,只报告字符串数组中的最后一项(参见代码)。
有几种方法可以准确报告有多少人在点击哪些页面。
所以,即使数据库中的数据很糟糕,我也可以选择获得好的报告。但是,我宁愿不在数据库中使用垃圾,也不想了解这里发生了什么。
感谢大家的期待!
答案 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)