Мой вопрос похож, но не идентичен:
Почему мой хост (softsyshosting.com) не поддерживает обработчики событий BeginRequest и EndRequest? (я также читал блог mvolo, на который есть ссылки)
Цель состоит в том, чтобы успешно перехватить HttpApplication.BeginRequest в событии IHttpModule.Init (или в любом месте внутри модуля), используя обычный модуль HttpModule, интегрированный через конфигурацию system.webServer, то есть тот, который не:
- вторжение в Global.asax или
переопределяет HttpApplication (модуль предназначен для автономного и многократного использования, поэтому, например, у меня есть такая конфигурация):
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="TheHttpModule" />
<add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" />
Пока что любая стратегия, которую я пытался подключить к HttpApplication.Begin слушателя, приводит к одной из двух причин: симптом 1 состоит в том, что BeginRequest никогда не срабатывает, или симптом 2 заключается в том, что следующее исключение возникает во всех управляемых запросах, и я не могу поймать и обработать его из кода пользователя:
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +30
System.Web.PipelineStepManager.ResumeSteps(Exception error) +1112
System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +113
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +616
Комментирование app.BeginRequest += new EventHandler(this.OnBeginRequest)
в Init останавливает исключение, конечно. Init вообще не ссылается на объекты Context или Request.
Я пробовал:
- Удалено все ссылки на HttpContext.Current в любом месте проекта (все еще симптом 1)
- Протестировано удаление всего кода из тела моего метода OnBeginRequest, чтобы убедиться, что проблема не является внутренней по отношению к методу (= исключение)
- Обнаружение трассировки стека и вызов только app.BeginRequest + = ... когда стек не запущен InitializeApplication (= BeginRequest не запускается)
- Только вызывая app.BeginRequest + = при втором проходе через Init (= BeginRequest не запускается)
Кто-нибудь знает хороший подход? Есть ли какая-то косвенная стратегия для перехвата Application_Start внутри модуля (кажется маловероятным)? Другое событие, которое а) можно подключить к конструктору модуля или методу Init, и б) которое впоследствии является безопасным местом для подключения обработчиков событий BeginRequest?
Большое спасибо