Вопрос о приватных полях реализации IHttpModule - PullRequest
0 голосов
/ 29 марта 2019

Для приложения, работающего в интегрированном режиме 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 между запросами под нагрузкой не будет состязаний?

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

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

...