Я задал тот же вопрос @davidfowl в Твиттере. Он ответил:
Нет, для этого нет ничего необычного. Это конец, конец
работает с пониманием приложения, но оно не очень детализировано. Ты можешь
рассмотрите возможность использования одного и того же промежуточного программного обеспечения в разных командах.
если
Есть рабочий элемент для решения этой проблемы в 3.0 https://github.com/aspnet/Hosting/issues/1350
Итак, из того, что сейчас выглядит, пользовательское промежуточное ПО - единственный путь вперед. Это может измениться в будущем выпуске.
Обновление
В итоге мы создали специальное промежуточное программное обеспечение, как предлагал @DavidMcEleney. Однако поверх этого мы добавили CorrelationId
к свойству AsyncLocal
. Это помогло нам получить доступ к CorrelationId
в любом месте кода, если / когда это потребуется. Вот код get / set CorrelationId
:
using System;
using System.Threading;
public static class CorrelationContext
{
private static readonly AsyncLocal<string> CorrelationId = new AsyncLocal<string>();
public static void SetCorrelationId(string correlationId)
{
if (string.IsNullOrWhiteSpace(correlationId))
{
throw new ArgumentException(nameof(correlationId), "Correlation id cannot be null or empty");
}
if (!string.IsNullOrWhiteSpace(CorrelationId.Value))
{
throw new InvalidOperationException("Correlation id is already set");
}
CorrelationId.Value = correlationId;
}
public static string GetCorrelationId()
{
return CorrelationId.Value;
}
}
Для использования в CorrelationMiddleware.cs
public class CorrelationMiddleware
{
private readonly RequestDelegate _next;
public CorrelationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
context.Request.Headers.TryGetValue("Correlation-Id-Header", out var correlationIds);
var correlationId = correlationIds.FirstOrDefault() ?? Guid.NewGuid().ToString();
CorrelationContext.SetCorrelationId(correlationId);
using (LogContext.PushProperty("Correlation-Id", correlationId))
{
await _next.Invoke(context);
}
}
}
Если позже нам понадобится получить доступ к CorrelationId
в любом месте кода, тогда мы просто позвоним: CorrelationContext.GetCorrelationId();