IHttpModule. Увольнение BeginRequest 2X, увольнение Application_BeginRequest 1X

Я запускаю VS 2008 и.NET 3,5 SP1.

Я хочу реализовать отслеживание хита в HttpModule в моем приложении ASP.NET. Довольно простой, я думал. Однако BeginRequest событие моего HttpModule стреляет дважды для каждого хита страницы. Сайт не очень прост прямо сейчас... никакая безопасность, просто немного работы базы данных. Должен зарегистрировать одну строку на хит страницы. Почему это событие стреляет дважды?

Кроме того, IHttpModule.BeginRequest на самом деле увольняет другое количество раз за первый хит страницы при выполнении впервые (от закрытого веб-браузера)... 3 раза, когда я поражаю DB для обеспечения динамических данных для страницы, и только в 1 раз для страниц, где DB не поражен. Это стреляет 2 раза для каждого хита страницы после первого, независимо от того, касаюсь ли я DB.

Интересно отметить это Application_BeginRequestGlobal.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 "";
        }
    }
}
6
задан Michael 1 May 2019 в 13:15
поделиться

2 ответа

Одной из возможностей состоит в том, что есть другие запросы, которые вы можете не рассматривать. Например, скажем, что ваша страница ASPX относится к файлам некоторых изображений или CSS. Если эти запросы проходят через трубопровод ASP.NET, то ваш модуль будет вызван, и они будут зарегистрироваться в качестве хитов.

Также, когда вы говорите ihttpmodule.beginrequest Вы имеете в виду, что в ihttpmodule.init () вы подключаете httpapplication.beginrequest? Если так, то причина, по которой я упоминаю выше, может по-прежнему применять.

0
ответ дан 17 December 2019 в 04:46
поделиться

Это интересно. Я удалил ссылку на файл CSS с главной страницы, и я получаю меньше повторных обращений в HttpModule для определенных браузеров (как было предложено), но я все еще получаю повторения. У меня установлено 6 браузеров, и я вижу некоторые различия между ними.

Для справки, это URL-адрес, который я подключаю к своим браузерам для этого теста:

http: // localhost / BluHeron

default.aspx установлен в качестве начальной страницы и фактически является получение возврата для вышеупомянутого URL. Я использую HttpRequest.RawUrl, чтобы сообщить, на какую страницу попал пользователь. В частности, я разделяю строку RawUrl и просто сообщаю последний элемент в массиве строк (см. Код).

  • Каждый браузер сообщает о попадании в default.aspx, как и ожидалось (RawUrl = /BluHeron/default.aspx).
  • 4 из 6 браузеров также сообщают о BluHeron (RawUrl = / BluHeron).
  • 3 из 6 браузеров также записывают пустые данные в базу данных (RawUrl = / BluHeron /).

Есть несколько способов получить точный отчет о том, сколько людей переходят на какие страницы.

  1. выбрать из базы данных только те строки, которые фактически содержат одну из моих страниц (ignore / BluHeron и пробелы)
  2. Просто используйте Application_BeginRequest в файле global.asax (который, кажется, последовательно вызывается только один раз при попадании на страницу)
  3. Разберитесь с этим

Итак, у меня есть возможности для получения хороших отчетов даже с дрянными данными в базе данных. Однако я бы предпочел не иметь в базе данных мусора и понимать, что здесь происходит.

Спасибо, что посмотрели!

1
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: