HttpModule.Init - safely add HttpApplication.BeginRequest handler in IIS7 integrated mode

Posted by Paul Smith on Stack Overflow See other posts from Stack Overflow or by Paul Smith
Published on 2010-09-14T20:22:35Z Indexed on 2011/01/01 8:54 UTC
Read the original article Hit count: 536

My question is similar but not identical to:

http://stackoverflow.com/questions/1123741/why-cant-my-host-softsyshosting-com-support-beginrequest-and-endrequest-event (I've also read the mvolo blog referenced therein)

The goal is to successfully hook HttpApplication.BeginRequest in the IHttpModule.Init event (or anywhere internal to the module), using a normal HttpModule integrated via the system.webServer config, i.e. one that doesn't:

  1. invade Global.asax or
  2. override the HttpApplication (the module is intended to be self-contained & reusable, so e.g. I have a config like this):

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

So far, any strategy I've tried to attach a listener to HttpApplication.BeginRequest results in one of two things, symptom 1 is that BeginRequest never fires, or symptom 2 is that the following exception gets thrown on all managed requests, and I cannot catch & handle it from user code:

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

Commenting out app.BeginRequest += new EventHandler(this.OnBeginRequest) in Init stops the exception of course. Init does not reference the Context or Request objects at all.

I have tried:

  • Removed all references to HttpContext.Current anywhere in the project (still symptom 1)
  • Tested removing all code from the body of my OnBeginRequest method, to ensure the problem wasn't internal to the method (= exception)
  • Sniffing the stack trace and only calling app.BeginRequest+=... when if the stack isn't started by InitializeApplication (= BeginRequest not firing)
  • Only calling app.BeginRequest+= on the second pass through Init (= BeginRequest not firing)

Anyone know of a good approach? Is there some indirect strategy for hooking Application_Start within the module (seems unlikely)? Another event which a) one can hook from a module's constructor or Init method, and b) which is subsequently a safe place to attach BeginRequest event handlers?

Thanks much

© Stack Overflow or respective owner

Related posts about c#

Related posts about iis7