Вопрос о закрытых полях реализации IHttpModule

#asp.net #iis #ihttpmodule

#asp.net #iis #ihttpmodule

Вопрос:

Для приложения, которое выполняется в интегрированном режиме IIS, я собираюсь реализовать System.Web.IHttpModule, и я хочу, чтобы реализация содержала закрытое поле, которое я хочу поместить в «область запроса». Следующий код иллюстрирует мою идею:

 // SillyErrorLoggingHttpModule.cs
using System;
using System.Web;
using Serilog;

public class SillyErrorLoggingHttpModule : IHttpModule
{
    private ILogger _logger;

    public void Init(HttpApplication context)
    {
        context.BeginRequest  = ContextOnBeginRequest;
        context.Error  = Context_Error;
        context.EndRequest  = (sender, args) => throw new ApplicationException();
    }

    private void ContextOnBeginRequest(object sender, EventArgs e)
    {
        if (sender is HttpApplication application)
        {
            _logger = GetLogger(application);
        }
        else
        {
            throw new ApplicationException("Toto, I've a feeling we're not in Kansas anymore.");
        }
    }

    private void Context_Error(object sender, EventArgs e)
    {
        if (sender is HttpApplication application)
        {
            _logger.Error(application.Server.GetLastError(), "badumtss!");
        }
        else
        {
            _logger.Error("tada-da-da!");
        }
    }

    public void Dispose()
    {
    }

    public ILogger GetLogger(HttpApplication application)
    {
        // something like this:
        return Log.Logger
            .ForContext("url", application.Request.Url)
            .ForContext("requestUUID", Guid.NewGuid().ToString());
    }
}
  

Моя цель — сохранить связь между свойством requestUUID сообщения журнала и исключением, возникшим во время запроса, для которого я инициализировал _logger с помощью requestUUID. Но…

Могу ли я быть уверен, что не будет состояния гонки для состояния IHttpModule между запросами под нагрузкой?

Могу ли я предположить, что мои сообщения журнала не будут перепутаны в этом случае?

Или, по крайней мере, есть ли какие-нибудь файлы в referencesource, где я могу проверить свое предположение?

Комментарии:

1. В одном процессе может быть несколько HttpApplication , каждый загружает экземпляр вашего модуля.

2. да, но я хочу знать, не будут ли перепутаны экземпляры. Например, если экземпляр обработал событие запроса begun для запроса A: 1, будет ли он обрабатывать событие ошибки приложения также для запроса A? и 2 не будет ли это обрабатывать событие begin request для запроса B, пока обработка A все еще продолжается? Я знаю, что обычно я могу использовать приложение. Контекст. Элементы для передачи данных между событиями, но я хотел бы иметь возможность по-прежнему сопоставлять журналы ошибок с запросами во время обработки события request_end

3. @Lex Li или я ошибаюсь, и одному экземпляру приложения «назначено» обрабатывать запрос, и он будет придерживаться его до конца запроса?