在托管管道集成模式下使用ApplicationPool在IIS 7.5的HTTPModule中访问BeginRequest / EndRequest事件

时间:2019-01-08 16:30:42

标签: iis-7.5 httpmodule

环境:使用设置为托管管道集成模式的AppPool的IIS 7.5

我正在尝试记录HTTP请求进入管道之前的某些状态以及HTTP响应的存在状态,特别是一些表单值和cookie集合。

我正在使用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设置

<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>

我将获得仅在应用程序日志中可用的运行时错误(try / catch不会捕获此异常):

异常信息:     异常类型:NullReferenceException     异常消息:对象引用未设置为对象的实例。    在System.Web.HttpApplication.PipelineStepManager.ResumeSteps(异常错误)    在System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext上下文,AsyncCallback cb)    在System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文)

这似乎与此处提出的问题非常相似:HttpModule.Init - safely add HttpApplication.BeginRequest handler in IIS7 integrated mode

该问题的解决方案与

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

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

鉴于该帖子已有8年历史了,解决方案未被其他帖子接受和批评,有没有办法现在实现这一目标?

0 个答案:

没有答案