Уникальный идентификатор запроса log4net в ASP.NET

log4net 1.2.11.0

Я пытаюсь получить все, что позволит мне регистрироваться с уникальным значением для каждого запроса ASP.NET.

Я пробовал% thread, но потоки, похоже, повторно используются.

Я пробовал% aspnet-request и% aspnet-session, которые не имеют в них ничего значимого.

Я просмотрел ThreadContext.Properties и LogicalThreadContext.Properties, но у них также нет ничего.

У кого-нибудь есть трюк, чтобы сделать это? Мне нужна возможность выбрать отдельные журналы запросов из файла журнала.

Ответ 1

clock tick + process ID + thread ID, который хранится при запуске вашего запроса, должен быть достаточным, я думаю (если каждый поток обрабатывает 1 запрос за раз).

Ответ 2

.asmx файлы по-прежнему будут вызывать событие Application_BeginRequest, где вы можете сохранить свой уникальный идентификатор GUID в HttpContext.Current.Items (используя эту коллекцию, избегайте нечетной проблемы, когда обработка запроса перескакивает потоки). Только если вы используете WCF (а также тогда это зависит от конфигурации), это не сработает.

Если вы не хотите касаться самого приложения, вы можете использовать HttpContext.Current.Timestamp, который возвращает время начала обработки запроса. Присоединитесь к существующему подходу получения идентификатора потока, и вы получите уникальное значение.

Ответ 3

HttpContext.Current.Items - хорошая идея.

Попробуйте добавить что-то вроде этого:

HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString())

Ответ 4

Вот некоторые методы расширения, которые я создал для этой цели:

public static Guid GetId(this HttpContext ctx) => new HttpContextWrapper(ctx).GetId();

public static Guid GetId(this HttpContextBase ctx)
{
    const string key = "tq8OuyxHpDgkRg54klfpqg== (Request Id Key)";

    if (ctx.Items.Contains(key))
        return (Guid) ctx.Items[key];

    var mutex = string.Intern($"{key}:{ctx.GetHashCode()}");
    lock (mutex)
    {
        if (!ctx.Items.Contains(key))
            ctx.Items[key] = Guid.NewGuid();

        return (Guid) ctx.Items[key];
    }
}