加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET – IHttpModule.BeginRequest触发2X,Application_BeginR

发布时间:2020-12-16 03:50:03 所属栏目:asp.Net 来源:网络整理
导读:我正在运行VS 2008和.NET 3.5 SP1. 我想在我的ASP.NET应用程序中的HttpModule中实现命中跟踪.我想,很简单.但是,我的HttpModule的BeginRequest事件对每个页面命中都会触发两次.该网站现在非常简单……没有安全性,只需要一些数据库工作.应该每页登录一行.为什
我正在运行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",browserVersion);
            db.AddInParameter(cmd,"PageName",page);
            db.AddInParameter(cmd,"Notes","");

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读