Доступ к событиям BeginRequest / EndRequest в HTTPModule для IIS 7.5 с помощью ApplicationPool в интегрированном режиме управляемого конвейера - PullRequest
0 голосов
/ 08 января 2019

Среда: 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 лет, и решение не было принято и подвергнуто критике на других постах, есть ли способ достичь этого сейчас?

...