Мы пытаемся удалить global.asax из наших многочисленных веб-приложений в пользу HttpModules, которые находятся в общей базе кода. Это работает очень хорошо для многих приложений, таких как BeginRequest и PostAuthentication, но в HttpModule нет события запуска приложения.Как я могу использовать или имитировать приложение OnStart в HttpModule?
Я могу придумать пару вонючих способов преодолеть этот дефицит. Например, я могу, вероятно, сделать это:
protected virtual void BeginRequest(object sender, EventArgs e)
{
Log.Debug("Entered BeginRequest...");
var app = HttpContext.Current.Application;
var hasBeenSet app["HasBeenExecuted"] == null ? false : true;
if(!hasBeenSet)
{
app.Lock();
// ... do app level code
app.Add("HasBeenExecuted", true);
app.Unlock();
}
// do regular begin request stuff ...
}
Но это просто не так хорошо пахнет.
Каков наилучший способ вызвать какую-либо логику запуска приложения без наличия global.asax?
@John: Это выглядит как одноэлементный узор. Я бы немного беспокоился об использовании статичности из-за проблем с потоками, когда, скажем, одновременно поступают несколько запросов. Объект приложения, по крайней мере, имеет некоторые простые блокировки/разблокировки, чтобы помочь в этом. –
@John: Я вижу, вы добавили, что сейчас ... :) –
@ Парусное судно: замок всегда был там. Ответ не редактировался. –