Sono in esecuzione VS 2008 e .NET 3.5 SP1.ASP.NET - IHttpModule.BeginRequest che attiva 2X, Application_BeginRequest che spara 1X
Desidero implementare il rilevamento dei colpi in un HttpModule nella mia app ASP.NET. Abbastanza semplice, pensai. Tuttavia, l'evento BeginRequest del mio HttpModule viene attivato due volte per ogni colpo di pagina. Il sito è molto semplice in questo momento ... nessuna sicurezza, solo un po 'di lavoro nel database. Dovrebbe registrare una riga per colpo di pagina. Perché questo evento sta sparando due volte?
Inoltre, IHttpModule.BeginRequest genera effettivamente un numero diverso di volte per il primo colpo di pagina quando si esegue per la prima volta (da un browser Web chiuso) ... 3 volte quando sto colpendo il DB per fornire dati dinamici per la pagina, e solo 1 volta per le pagine in cui il DB non viene colpito. Spara 2 volte per ogni colpo di pagina dopo il primo, indipendentemente dal fatto che tocchi o meno il DB.
È interessante notare che Application_BeginRequest (in Global.asax) viene sempre attivato solo una volta.
Ecco il codice:
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 "";
}
}
}
Puoi pubblicare il codice che stai utilizzando per HttpModule? Sembra che forse gli eventi non vengano collegati correttamente. –