【发布时间】:2010-02-02 03:03:41
【问题描述】:
我正在运行 VS 2008 和 .NET 3.5 SP1。
我想在我的 ASP.NET 应用程序的 HttpModule 中实现命中跟踪。很简单,我想。但是,我的HttpModule 的BeginRequest 事件会为每个页面点击触发两次。该站点现在非常简单......没有安全性,只是一些数据库工作。应记录每页命中一行。为什么这个事件会触发两次?
此外,IHttpModule.BeginRequest 在第一次运行时(从关闭的 Web 浏览器)实际上触发了不同次数的第一页命中...当我点击数据库以提供动态数据时 3 次该页面,对于未命中数据库的页面只有 1 次。在第一个页面点击之后,它会触发 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 "";
}
}
}
【问题讨论】:
-
您可以发布您用于 HttpModule 的代码吗?听起来可能事件没有正确连接。
标签: asp.net httpmodule