#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 или я ошибаюсь, и одному экземпляру приложения «назначено» обрабатывать запрос, и он будет придерживаться его до конца запроса?