Accessing BeginRequest/EndRequest events in HTTPModule for IIS 7.5 with ApplicationPool in Managed Pipeline Integrated mode

Viewed 300

Environment: IIS 7.5 using an AppPool set to Managed Pipeline Integrated mode

I'm trying to log the certain state of the HTTP Request before it enters the pipeline and the HTTP response as it exists, specifically a few form values and the cookie collection.

I'm doing this in an HTTPModule

public class MyLoggingModule : IHttpModule
{
  private static readonly log4net.ILog _logger = 
          log4net.LogManager.GetLogger(typeof(MyLoggingModule));

  public void Init(HttpApplication context)
  {
    context.BeginRequest += LogRequestState;
    context.EndRequest += LogResponseState;
  }
}

private void LogRequestState(object sender, EventArgs e)
{   
  //Invokes...
  HttpContext.Current.Server.UrlDecode
  HttpContext.Current.Request.Url
  HttpContext.Current.Request.Form.AllKeys
  HttpContext.Current.Request.Cookies
  HttpContext.Current.Response.Cookies.AllKeys
  _logger.Debug("...");
}

private void LogResponseState(object sender, EventArgs e) 
{
  // Invokes ...
  FederatedAuthentication.SessionAuthenticationModule.CookieHandler.Name
  HttpContext.Current.Response.Cookies.AllKeys
  _logger.Debug("...");
}

Web.Config settings

<system.webServer>
 <validation validateIntegratedModeConfiguration="false" />
 <modules runAllManagedModulesForAllRequests="false">
  <add name="MyLoggingModule" type="MyApp.Api.HttpModules.MyLoggingModule, MyApp.Api"/>
 </modules>
 <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

I will get a runtime error only available in the Application Logs (try/catch does not catch this exception):

Exception information: Exception type: NullReferenceException Exception message: Object reference not set to an instance of an object. at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error) at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)

It seems to be very similar to the issue raised here: HttpModule.Init - safely add HttpApplication.BeginRequest handler in IIS7 integrated mode

That issue has a solution along the lines of

public class MyLoggingModule : IHttpModule
{
 public override void Init()
 {
    base.Init();

    lock (_initialisationLockObject)
    {
      context.BeginRequest -= LogRequestState;
      context.BeginRequest += LogRequestState;
      context.EndRequest -= LogResponseState;
      context.EndRequest += LogResponseState;
    }
  }
}

Given that the post is over 8 years old and the solution was not accepted and criticized on other posts is there a way to achieve this now?

0 Answers
Related