Я использую VS 2008 и .NET 3.5 SP1.
Я хочу реализовать отслеживание попаданий в HttpModule
в моем приложении ASP.NET. Довольно просто, подумал я. Тем не менее, событие BeginRequest
моего HttpModule
запускается дважды при каждом попадании на страницу. Сайт сейчас очень прост ... нет безопасности, просто немного работы с базой данных. Должен регистрировать одну строку на страницу попадания. Почему это событие запускается дважды?
Более того, IHttpModule.BeginRequest
фактически запускает другое число раз для первого обращения к странице при первом запуске (из закрытого веб-браузера) ... 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", 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 "";
}
}
}