【发布时间】:2020-09-11 21:23:23
【问题描述】:
我收到这样的错误:
无法使用单例“MyNamespace.IMyCustomThing”中的范围服务“Microsoft.AspNetCore.Http.IHttpContextAccessor”
我很困惑,因为我通过调用services.AddHttpContextAccessor() 注册了IHttpContextAccessor。 AddHttpContextAccessor 的代码是here。相关部分是这样的:
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
IHttpContextAccessor 注册为单例。为什么 ASP.Net Core 认为它是一个作用域服务?
注意:如果相关,IMyCustomThing 使用IHttpContextAccessor 来查看是否有当前的HttpContext,如果没有则采取其他操作。
【问题讨论】:
-
应该将哪个范围的
IHttpContextAccessor实例提供给您的单身人士IMyCustomThing? -
@madreflection - 这使它非常有意义(现在)。不知道为什么源代码显示这个注册为单例,但它真的不能作为一个。我可以同时进行 10 个调用,当我请求 HttpContext 时,我需要以某种方式说出我的意思是哪一个。如果调用来自单例,那是不可能的。
-
@madreflection - 虽然看着这个问题/答案:stackoverflow.com/questions/46330007/… 它似乎表明它使用
AsyncLocal来告诉它将返回哪个HttpContext。所以它应该能够作为一个 Singleton 工作。它注册为一个。 (通过上述错误,我再次感到困惑,为什么会这样。) -
AsyncLocal获取上下文,但我们在这里讨论的是上下文访问器。看起来上下文访问器可以注册为单例,但有些东西错误地将其注册为作用域。如果您不拨打services.AddHttpContextAccessor()会发生什么?相同的错误(即其他东西正在注册它)或有关服务未注册的错误? -
@madreflection - 就是这样!我发现这条邪恶线潜伏在一个方法中:
services.AddScoped<IHttpContextAccessor, HttpContextAccessor>()。一旦我删除错误就消失了!如果您想发布作为答案,我会接受。
标签: c# asp.net-core asp.net-core-3.1 .net-core-3.1