Среда: IIS 7.5 с использованием AppPool, установленного в интегрированный режим управляемого конвейера
Я пытаюсь записать определенное состояние 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 - безопасно добавьте обработчик HttpApplication.BeginRequest в интегрированном режиме IIS7
У этой проблемы есть решение, аналогичное
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 лет, и решение не было принято и подвергнуто критике на других постах, есть ли способ достичь этого сейчас?