Estoy ejecutando VS 2008 y .NET 3.5 SP1.ASP.NET - IHttpModule.BeginRequest activando 2X, Application_BeginRequest disparando 1X
Quiero implementar el seguimiento de visitas en un HttpModule en mi aplicación ASP.NET. Bastante simple, pensé. Sin embargo, el evento BeginRequest de mi HttpModule se activa dos veces por cada visita a la página. El sitio es muy simple en este momento ... sin seguridad, solo un poco de trabajo en la base de datos. Debería iniciar sesión una fila por página. ¿Por qué este evento se dispara dos veces?
Además, IHttpModule.BeginRequest realmente dispara una cantidad diferente de veces para el primer hit de la página cuando se ejecuta por primera vez (desde un navegador web cerrado) ... 3 veces cuando estoy llegando al DB para proporcionar datos dinámicos para la página, y solo 1 vez para las páginas donde no se golpea la base de datos. Dispara 2 veces por cada página golpeada después de la primera, independientemente de si toco o no la base de datos.
Es interesante observar que Application_BeginRequest (en Global.asax) siempre se activa solo una vez.
Aquí está el código:
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 "";
}
}
}
¿Puedes publicar el código que estás usando para el HttpModule? Parece que los eventos no están siendo enganchados correctamente. –