2010-09-14 6 views
11

Мой вопрос похож, но не идентичны:HttpModule.Init - смело добавить HttpApplication.BeginRequest обработчик в IIS7 интегрированном режиме

Why can't my host (softsyshosting.com) support BeginRequest and EndRequest event handlers? (я также прочитать mvolo блог ссылки в ней)

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

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

    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules> 
        <remove name="TheHttpModule" /> 
        <add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" /> 
    

До сих пор, любая стратегия, я пытался прикрепить слушателя к 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 не ссылается на объекты контекста или запроса вообще.

Я пробовал:

  • Удалены все ссылки на HttpContext.Current где-нибудь в проекте (по-прежнему симптома 1)
  • Испытано удаления весь код из тела моего OnBeginRequest метода, чтобы обеспечить проблема не была внутренней для метода (= исключение)
  • Обнюхивание трассировки стека и вызов только приложения. BeginRequest + = ... когда, если стек не запускается InitializeApplication (= BeginRequest не работает)
  • Только вызов app.BeginRequest + = на втором проходе через Init (= BeginRequest не сжигание)

Кто-нибудь знает о хорошем подходе? Есть ли какая-то косвенная стратегия для подключения Application_Start в модуле (кажется маловероятным)? Другое событие, которое: a) можно зацепить с помощью конструктора модуля или метода Init, а b), который впоследствии является безопасным местом для присоединения обработчиков событий BeginRequest?

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

ответ

3

метод Init вашего HttpModule будет вызываться несколько раз с помощью одного веб-приложения (в то время как Application_Start в вашем global.asax только дозвонились один раз в AppDomain).

Инициал действительно является местом, где можно подключиться к BeginRequest.

Я тоже столкнулся с этой ошибкой, и это было вызвано подключением к событию BeginRequest более одного раза. Я не уверен, что это ошибка в интегрированном режиме IIS 7 или нет.

Когда вы выполняете app.BeginRequest, вы вызываете context.BeginRequest, используя параметр контекста для вашего Init метода IHttpModule или вы вызываете HttpContext .Current.BeginRequest + = ...?

+2

в 'ничтожной IHttpModule.Init (HttpApplication приложение)', 'Я называю app.BeginRequest + = новый EventHandler (this.OnApplication_BeginRequest)'. Затем я использую статический bool на уровне класса, _initted, чтобы предотвратить добавление обработчика несколько раз. Отчасти потому, что ситуация забивает меня за такой цикл. –

+0

Одинаковый вопрос здесь. Я также отправил сообщение на сайт IIS, надеясь, что кто-то из Microsoft может получить ответ: http://forums.iis.net/p/1164977/1972908.aspx –

+0

Любое решение? Я могу добавить httpModule в любое приложение ASP.NET. Однако я получаю ту же ошибку при попытке добавить IHttpModule на сайт SharePoint 2013 (основанный на .NET 4.0). Проблема возникает, как только я присоединяюсь к событию BeginRequest. – lapsus

1

У меня были те же проблемы, о которых говорилось выше. Я обнаружил, что практическая работа всегда заключалась в том, чтобы всегда удалять, а затем добавлять обработчика. таким образом:

public override void Init() 
    { 
     base.Init(); 

     lock (_initialisationLockObject) 
     { 
      BeginRequest -= Global_BeginRequest; 
      BeginRequest += Global_BeginRequest; 
     } 
    } 

Я подозреваю, что обработчики событий становятся разъединяются после одного или нескольких из многочисленных обращений к инициализации. Если вы тщательно только попытаетесь добавить обработчик событий в первый раз, то последующие вызовы init будут вызваны, не получите добавленное событие и, следовательно, обработчик вообще не будет вызван. Если вы не попробуете ничего хитрого, чтобы ограничить количество раз, когда событие добавляется, то вы видели, чтобы получить несколько вложений. Сперва попытка удалить, а затем добавить (внутри замка, чтобы остановить любые гнусные условия гонки), похоже, делает трюк.

Это ужасно, хотя, и мы не должны это делать!

Надежда, что помогает

+0

В моем случае мне просто нужно сделать что-то вроде: System.Web.HttpContext.Current.ApplicationInstance.BeginRequest + = ApplicationInstance_BeginRequest; но он выбрасывает исключение с нулевым указателем. Рабочее время + = - = работало – orellabac