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

我想在我的ASP.NET应用程序中的HttpModule中实现点击跟踪。我想很简单。但是,我的BeginRequestHttpModule事件在每次点击时触发两次。该站点现在非常简单...没有安全性,只有一点数据库工作。每页命中应记录一行。为什么此事件触发两次?

此外,首次运行(从封闭的Web浏览器)时,IHttpModule.BeginRequest实际上为第一次命中页面触发不同的次数...当我命中数据库为页面提供动态数据时,Application_BeginRequest触发了3次。 1次用于未命中数据库的页面。不管我是否接触数据库,在第一个页面之后命中的每个页面都会触发2次。

有趣的是,Global.asax(在ojit_code中)始终仅触发一次。

这是代码:

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 "";
        }
    }
}

最佳答案

答案可能为时已晚,但对其他人可能有用。我面临着同样的问题。每个请求两次触发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; }

10-08 06:16
查看更多