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