我想在我的ASP.NET应用程序中的HttpModule中实现点击跟踪。我认为这很简单。然而,每个页面点击都会触发我的HttpModule的BeginRequest事件两次。现在网站非常简单...没有安全性,只有一点数据库工作。应该记录每个页面点击一行。为什么这个事件会触发两次呢?
此外,当第一次运行(从关闭的Web浏览器)时,IHttpModule.BeginRequest实际上会对第一个页面点击触发不同数量的事件...当我正在访问DB以为页面提供动态数据时,它会触发3次,而对于没有访问DB的页面,只会触发1次。对于第一个页面点击后的每个页面点击,无论我是否接触到DB,它都会触发2次。
值得注意的是,Application_BeginRequest(在Global.asax中)总是只会触发一次。
以下是代码:
using System;
using System.Data;
using System.Data.Common;
using System.Net;
using System.Web;
using BluHeron.BusinessLayer;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
namespace BluHeron.HttpModules
{
public class SiteUsageModule : IHttpModule
{
public void Init(HttpApplication httpApp)
{
httpApp.BeginRequest += OnBeginRequest;
}
static void OnBeginRequest(object sender, EventArgs a)
{
UsageLogger.LogSiteUsage(((HttpApplication)sender).Context.Request);
}
public void Dispose()
{ }
}
public static class UsageLogger
{
public static void LogSiteUsage(HttpRequest r)
{
string ipAddress = GetHostAddress(Dns.GetHostAddresses(Dns.GetHostName()));
string browserVersion = r.Browser.Type;
string[] urlChunks = r.RawUrl.Split('/');
string page = urlChunks[urlChunks.GetLength(0)-1];
SqlDatabase db = new SqlDatabase(Common.GetConnectionString());
DbCommand cmd = db.GetStoredProcCommand("LogUsage");
db.AddInParameter(cmd, "IPAddress", SqlDbType.NVarChar, ipAddress);
db.AddInParameter(cmd, "BrowserVersion", SqlDbType.NVarChar, browserVersion);
db.AddInParameter(cmd, "PageName", SqlDbType.NVarChar, page);
db.AddInParameter(cmd, "Notes", SqlDbType.NVarChar, "");
db.ExecuteNonQuery(cmd);
}
private static string GetHostAddress(IPAddress[] addresses)
{
foreach (IPAddress ip in addresses)
{
if (ip.ToString().Length <= 15)
{
return ip.ToString();
}
}
return "";
}
}
}