InvalidOperationException:无法解析类型为"Microsoft.AspNetCore.Http.IHttpContextAccessor"的服务

Yur*_*iyP 114 .net dependency-injection asp.net-core

我开始将我的asp.net核心RC1项目转换为RC2,并面临现在IHttpContextAccessor无法解决的问题.

为简单起见,我使用Visual Studio模板创建了新的ASP.NET RC2项目ASP.NET Core Web Application (.Net Framework).比我添加了HomeController的构造函数,为我创建了哪个模板.

public HomeController(IHttpContextAccessor accessor)
{
}
Run Code Online (Sandbox Code Playgroud)

在我开始申请后,我收到下一个错误:

InvalidOperationException:尝试激活"TestNewCore.Controllers.HomeController"时,无法解析类型"Microsoft.AspNetCore.Http.IHttpContextAccessor"的服务.Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)

在我的实际应用中,我需要解决IHttpContextAccessor我自己的服务类获得访问_contextAccessor.HttpContext.Authentication_contextAccessor.HttpContext.User.在RC1中,Everething运行良好.那么怎么能想到RC2呢?

Joe*_*tte 178

默认情况下,IHttpContextAccessor不再连接,您必须自己注册

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

  • 啊,这里讨论过,多人验证它可以安全地成为`Singleton`.https://github.com/aspnet/Hosting/issues/793 (8认同)
  • 这是有效的.与`services.AddScoped <IActionContextAccessor,ActionContextAccessor>()相同的故事 (6认同)
  • 请参阅下一个关于使用 Microsoft 首选/推荐的扩展方法“services.AddHttpContextAccessor()”的答案。 (6认同)
  • 我们是否有关于适当范围的官方建议?应该是`Singleton`,`Scoped`还是`Transient`? (5认同)

Cal*_*alC 93

从.NET Core 2.1开始,添加了一个扩展方法以正确注册IHttpContextAccessor为单例.请参阅添加帮助程序以注册IHttpContextAccessor#947.只需在您的ConfigureServices()方法中添加如下:

services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)

这相当于:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)


小智 17

对于 .NET Core 6.0,在类中添加以下内容Program.cs

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
Run Code Online (Sandbox Code Playgroud)


Sha*_*med 12

对于.NET Core 7.0,在Program.cs类中添加以下代码:

builder.Services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)

这相当于:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)


Mik*_*ari 5

对于任何来到这里并进行注入HttpContextAccessor而不是IHttpContextAccessor在要使用它的类的构造函数中进行注入的人。

抛出同样的错误,内部异常将指向有问题的类。