我开始将我的asp.net core RC1项目转换为RC2,并面临现在
IHttpContextAccessor
未解决的问题。
为了简单起见,我使用 Visual Studio 模板创建了新的 ASP.NET RC2 项目
ASP.NET Core Web Application (.Net Framework)
。我为 HomeController 添加了该模板为我创建的构造函数。
public HomeController(IHttpContextAccessor accessor)
{
}
在我开始应用程序后,我收到下一个错误:
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
。 Everething 在 RC1 中运行良好。那么它怎么会出现在 RC2 中呢?
IHttpContextAccessor 不再默认连线,你必须自己注册
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
从 .NET Core 2.1 开始,添加了一个扩展方法来正确地将
IHttpContextAccessor
注册为单例。请参阅添加帮助程序以注册 IHttpContextAccessor #947。只需在您的 ConfigureServices()
方法中添加如下内容:
services.AddHttpContextAccessor();
这相当于:
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
对于 .NET Core 6.0,在
Program.cs
类中添加以下内容:
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
对于.NET Core 7.0,在Program.cs类中添加以下代码:
builder.Services.AddHttpContextAccessor();
这相当于:
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
对于来到这里并在要使用它的类的构造函数中注入
HttpContextAccessor
而不是 IHttpContextAccessor
的人来说。
抛出同样的错误,内部异常将指向有问题的类。
services.AddScoped(sp => sp.GetService<IHttpContextAccessor>().HttpContext.Session);
您现在可以使用 Microsoft.Extensions.DependencyInjection
中的 AddHttpContextAccessor 扩展方法示例:
builder.Services.AddHttpContextAccessor();
即使在 DI 中注册了服务,我也遇到了同样的问题(类似的错误消息)。也许对某人有用,而不是使用我使用实际实现的接口。
这不起作用:
private readonly HttpContextAccessor _contextAccessor;
public YourController(HttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
您必须使用该界面:
private readonly IHttpContextAccessor _contextAccessor;
public YourController(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}