Как я могу использовать или подражать Application OnStart в HttpModule? - PullRequest
1 голос
/ 02 апреля 2010

Мы пытаемся удалить global.asax из наших многочисленных веб-приложений в пользу HttpModules, которые находятся в общей кодовой базе. Это работает очень хорошо для многих событий приложения, таких как BeginRequest и PostAuthentication, но в 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?

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Просто держите статический бул в HttpModule:

private static bool _hasApplicationStarted = false;
private static object _locker = new object();

private void EnsureStarted()
{
    if (_hasApplicationStarted) return;

    lock (_locker)
    {
        if (_hasApplicationStarted) return;

        // perform application startup here

        _hasApplicationStarted = true;
    }
}

Затем вызовите любой метод, для которого требуется запуск приложения, просто вызовите EnsureStarted.

0 голосов
/ 02 апреля 2010

HttpModules и HttpHandlers будут выполняться при каждом отдельном запросе, а событие запуска приложения Global.asax - при запуске приложения, то есть только один раз.

Вы можете создать общий global.asax, который будет загружать все сборки с определенным интерфейсом, а затем помещать DLL-файлы, которые вы хотите выполнить для этого конкретного приложения. Или даже зарегистрируйте их в своем файле web.config, и пусть ваш общий global.asax прочитает ключи, а затем загрузит и выполнит нужный код.

Я думаю, что это лучше, чем помещать приложение один раз в модуль и проверять переменную состояния.

...