HttpModule.Init - безопасно добавить обработчик HttpApplication.BeginRequest в интегрированном режиме IIS7

Мой вопрос похож на, но не идентичен:

Почему мой хост (softsyshosting.com) не может поддерживать обработчики событий BeginRequest и EndRequest? (я также читал упомянутый там блог mvolo)

Цель состоит в том, чтобы успешно перехватить HttpApplication.BeginRequest в событии IHttpModule.Init (или в любом другом месте внутри модуля), используя обычный HttpModule, интегрированный через систему. webServer config, то есть тот, который не:

  1. вторгается в Global.asax или
  2. переопределяет HttpApplication (модуль предназначен для автономного и многоразового использования, поэтому, например, у меня есть такая конфигурация):

      com) поддерживают обработчики событий BeginRequest и EndRequest? (Я также читал упомянутый там блог mvolo) ...  

    Мой вопрос похож на, но не идентичен:

    Почему мой хост (softsyshosting.com) не может поддерживать обработчики событий BeginRequest и EndRequest? (я также читал упомянутый там блог mvolo)

    Цель состоит в том, чтобы успешно перехватить HttpApplication.BeginRequest в событии IHttpModule.Init (или в любом другом месте внутри модуля), используя обычный HttpModule, интегрированный через систему. webServer config, то есть тот, который не:

    1. вторгается в Global.asax или
    2. переопределяет HttpApplication (модуль предназначен для автономного и многоразового использования, поэтому, например, у меня есть такая конфигурация):

        com) поддерживают обработчики событий BeginRequest и EndRequest? (Я также читал упомянутый там блог mvolo) ...  

      Мой вопрос похож на, но не идентичен:

      Почему мой хост (softsyshosting.com) не может поддерживать обработчики событий BeginRequest и EndRequest? (я также читал упомянутый там блог mvolo)

      Цель состоит в том, чтобы успешно перехватить HttpApplication.BeginRequest в событии IHttpModule.Init (или в любом другом месте внутри модуля), используя обычный HttpModule, интегрированный через систему. webServer config, то есть тот, который не:

      1. вторгается в Global.asax или
      2. переопределяет HttpApplication (модуль предназначен для автономного и многоразового использования, поэтому, например, у меня есть такая конфигурация):

         

      До сих пор любая стратегия, которую я пытался прикрепить к HttpApplication.BeginRequest, приводит к одному из двух: симптом 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?

      Большое спасибо

12
задан Community 23 May 2017 в 10:30
поделиться