添加的作用域服务在中间件内的同一请求上产生空错误

问题描述 投票:0回答:1

我正在创建一个自定义中间件,用于遥测目的。这个中间件将有一个服务,用于跟踪我的 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.
,我希望我的字典状态将被保留。但这只发生在单身人士身上。为什么事情没有按照我预期的方式发生?

c# asp.net-core
1个回答
0
投票

希望您对此有答案

© www.soinside.com 2019 - 2024. All rights reserved.