我正在创建一个自定义中间件,用于遥测目的。这个中间件将有一个服务,用于跟踪我的 API 生成的不同日志,一旦触发请求响应,它就会将跟踪发送到 AppInsights。
中间件的Invoke方法如下所示:
public async Task InvokeAsync(HttpContext context)
{
_telemetryService.InitNewEvent();
_telemetryService.Add("path", context.Request.Path, null); // Add works here
await _next(context);
_telemetryService.Add("statusCode", context.Response.StatusCode, null); // Add throws null error here
_telemetryService.SendEvent(context.Response);
}
遥测服务摘录
public class TelemetryService
{
private TelemetryClient _telemetryClient;
private List<TelemetryTrace> _currentTelemetryEventData;
private Dictionary<string, string> _finalisedTelemetryEventData;
private string _eventName;
private string _apiName = "pmapi";
public TelemetryService(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
public void InitNewEvent()
{
_currentTelemetryEventData = new List<TelemetryTrace>();
Console.WriteLine("New telemetry event inited");
}
public void Add(string key, object data, SeverityLevel? severityLevel)
{
_currentTelemetryEventData.Add(new TelemetryTrace
{
Key = key,
Data = data,
SeverityLevel = severityLevel
});
}
}
一个新事件只是一个字典,由中间件和添加到其中的日志初始化。然后中间件等待管道的响应,在此期间API控制器会将其他日志添加到事件中,然后将状态代码添加到事件中,并在管道返回到中间件时发送事件。
但是我注意到,如果我将
telemetryService
添加为作用域或瞬态服务,则在调用 await _next(context)
后,保存日志数据的字典将设置回 null。
这对于瞬态是有意义的,但是由于作用域的定义是
Scoped objects are the same within a request, but different across different requests.
,我希望我的字典状态将被保留。但这只发生在单身人士身上。为什么事情没有按照我预期的方式发生?
希望您对此有答案