Подключитесь к Application_Start в HttpModule - PullRequest
10 голосов
/ 06 мая 2010

Я реализую простой HttpModule, где я хочу, чтобы какой-то код запускался при запуске веб-приложения.Но я удивлен, обнаружив, что событие Application_Start, которое я обычно использовал бы из Global.asax, недоступно из HttpModule.Это правильно, или я что-то здесь упускаю?

Как мне подключиться к событию Application_Start из HttpModule?

Обновление:
Я пришелк простому решению, используя вместо этого событие Init, но оно все еще пахнет немного смешно.

Ответы [ 6 ]

29 голосов
/ 06 октября 2010

Вы МОЖЕТЕ использовать HttpModule для обработки события запуска приложения

В отличие от других, которые пишут / верят только тому, что они читают, я сделал свою собственную часть и обнаружил, что можно обрабатывать запуск приложения, используя модуль HTTP. Это на самом деле немного хак, но надежно работает. Это определенно не то, чего кто-то должен избегать, потому что я видел это и в модулях MS (а именно Sharepoint 2010 SPRequestModule). Этот мой пост в блоге ( Написание собственного IHttpModule, который обрабатывает событие Application_Start ), получит Вы всю информацию, которую вам нужно знать об этом. Я сделал это сам, и это просто работает. Но вы должны быть немного осторожны при использовании общих ресурсов, потому что ваше приложение может начать вести себя странно. Чтобы избежать этого, я предлагаю вам прочитать дополнительный пост моего блога , в котором объясняется, почему это происходит и как этого избежать.

Если вы хотите, чтобы он также был поточно-ориентированным, вы также можете заблокировать выполнение и пометить модуль как приложение, запущенное . Это самый безопасный способ сделать это.

private static bool isStarted = false;
private static object moduleStart = new Object();
...
if (!isStarted)
{
    lock(moduleStart)
    {
        if (!isStarted)
        {
            // handle aplication start
            ...
            isStarted = true;
        }
    }
}

Я создал свою собственную библиотеку, которая подключается к существующим приложениям, таким как Sharepoint 2010. Я не хочу менять Global.asax на Sharepoint, не так ли? Используя технику, описанную в сообщении в блоге, я смог подключиться к ней. Легко.

И я думаю, это именно то, что вы искали. Подключение к событию запуска произвольного приложения путем добавления модуля в web.config. Сделай это так. Это будет работать.

1 голос
/ 17 мая 2010

Я согласен с Дарином.

причина в том, что приложение должно быть загружено для загрузки модулей, так как вы можете выполнить код внутри модуля, прежде чем приложение будет готово начать загрузку самого модуля?

Что ты пытаешься сделать? Возможно, стоит оценить, как выглядит идея вашего решения:)

Надеюсь, это поможет:)

1 голос
/ 06 мая 2010

Вы не можете присоединиться к событию Application_Start в модуле HttpModule. Вот список доступных событий .

0 голосов
/ 23 марта 2017

Я заинтересовался этой темой и тем, как веб-сайт начал работать при исправлении ошибки на старом сайте ASP.NET.

Итак, я собрал демо, чтобы посмотреть, как это будет работать. Кажется, заказ IS из web.config.

Вы можете увидеть здесь https://github.com/jradxl/MVC-Website-Without-Global.asax.cs Он реализует решение Роберта Коритника - спасибо

0 голосов
/ 23 марта 2017

Как узнать, будет ли Init () с кодом блокировки первым вызываться из модулей? Конечно, другие модули могут быть созданы в первую очередь? Разве это не различие для события Application_Start от Global.asax - оно гарантированно будет вызвано первым?

0 голосов
/ 29 октября 2015

На самом деле, существует и всегда будет только один экземпляр определенного модуля http, пока пул приложений не будет перезапущен. И, конечно же, за w3wp.exe работника вашего веб-приложения.

Другими словами, используйте метод init или конструктор init, чтобы выполнить инициализацию, предварительную загрузку данных и т. Д .;) и не используйте статические поля, за исключением того, что вам нужно выполнить блокировку, как только запросы начнут запускать события, на которые подписан ваш модуль, и вам нужно изменить данные Модуль контролирует или содержит в качестве свойств. В любом случае, метод init вызывается при запуске приложения.

...