【问题标题】:Cannot consume scoped service 'IHttpContextAccessor' from singleton 'IMyCustomThing'无法使用单例“IMyCustomThing”中的范围服务“IHttpContextAccessor”
【发布时间】: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&lt;IHttpContextAccessor, HttpContextAccessor&gt;()。一旦我删除错误就消失了!如果您想发布作为答案,我会接受。

标签: c# asp.net-core asp.net-core-3.1 .net-core-3.1


【解决方案1】:

正如我们在 cmets 中得出的结论,您有一些东西将 IHttpContextAccessor 注册为范围服务。删除它。

services.AddHttpContextAccessor() 将其注册为单例,因为它被设计为使用。

【讨论】:

  • 感谢您的帮助!
  • 我很高兴我能提供它。
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2018-01-30
  • 2021-01-11
相关资源
最近更新 更多