Ich verwende VS 2008 und .NET 3.5 SP1.ASP.NET - IHttpModule.BeginRequest feuern 2X, Application_BeginRequest feuern 1X
Ich möchte Hit-Tracking in einem HttpModule in meiner ASP.NET-App implementieren. Ziemlich einfach, dachte ich. Das BeginRequest-Ereignis meines HttpModule wird jedoch zweimal für jeden Seitentreffer ausgelöst. Die Seite ist momentan sehr einfach ... keine Sicherheit, nur ein bisschen Datenbankarbeit. Sollte eine Zeile pro Seite aufschlagen. Warum wird dieses Ereignis zweimal ausgelöst?
Darüber hinaus feuert IHttpModule.BeginRequest tatsächlich eine andere Anzahl von Zeiten für die erste Seite Treffer beim ersten Mal (von einem geschlossenen Webbrowser) ... 3 Mal wenn ich die DB treffen, um dynamische Daten bereitzustellen für die Seite und nur 1 Mal für Seiten, auf denen die DB nicht getroffen wird. Es wird 2 Mal für jede Seite ausgelöst, die nach der ersten getroffen wird, unabhängig davon, ob ich die DB berühre oder nicht.
Es ist interessant zu beachten, dass Application_BeginRequest (in Global.asax) immer nur einmal ausgelöst wird.
Hier ist der 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 "";
}
}
}
Können Sie den Code, den Sie für das HttpModule verwenden, veröffentlichen? Es hört sich so an, als ob die Ereignisse nicht genau richtig sind. –