环境:使用设置为托管管道集成模式的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年历史了,解决方案未被其他帖子接受和批评,有没有办法现在实现这一目标?