我找到了一个解决方案,可能不是最漂亮的,但至少它似乎有效。
我创建了一个静态可访问的AsyncLocal
实例来保存每个线程的 RequestTelemetry 对象。
public class RequestVariables
{
public static AsyncLocal<RequestTelemetry> RequestTelemetry = new AsyncLocal<RequestTelemetry>();
}
我将值设置RequestVariables.RequestTelemetry
为ITelemetryInitializer
public class RequestTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
if (telemetry is RequestTelemetry requestTelemetry)
RequestVariables.RequestTelemetry.Value = requestTelemetry;
}
}
然后我在方法中注册了一个小型中间件,该中间件Startup.Configure(...)
获取由RequestTelemetry
设置的实例ITelemetryInitializer
并将请求标头添加到其中。
app.Use((context, next) =>
{
var requestTelemetry = RequestVariables.RequestTelemetry.Value;
if (requestTelemetry?.Context == null) return next();
foreach (var header in context.Request.Headers)
{
if (!requestTelemetry.Context.Properties.ContainsKey(header.Key))
requestTelemetry.Context.Properties.Add(header.Key, header.Value.First());
}
return next();
});