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

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

我开始将我的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 中呢?

.net dependency-injection asp.net-core
8个回答
372
投票

IHttpContextAccessor 不再默认连线,你必须自己注册

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

241
投票

从 .NET Core 2.1 开始,添加了一个扩展方法来正确地将

IHttpContextAccessor
注册为单例。请参阅添加帮助程序以注册 IHttpContextAccessor #947。只需在您的
ConfigureServices()
方法中添加如下内容:

services.AddHttpContextAccessor();

这相当于:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

17
投票

对于 .NET Core 6.0,在

Program.cs
类中添加以下内容:

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

12
投票

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

builder.Services.AddHttpContextAccessor();

这相当于:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

5
投票

对于来到这里并在要使用它的类的构造函数中注入

HttpContextAccessor
而不是
IHttpContextAccessor
的人来说。

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


1
投票
services.AddScoped(sp => sp.GetService<IHttpContextAccessor>().HttpContext.Session);

1
投票

您现在可以使用 Microsoft.Extensions.DependencyInjection

中的 AddHttpContextAccessor 扩展方法

示例:

builder.Services.AddHttpContextAccessor();

0
投票

即使在 DI 中注册了服务,我也遇到了同样的问题(类似的错误消息)。也许对某人有用,而不是使用我使用实际实现的接口。

这不起作用:

private readonly HttpContextAccessor _contextAccessor;

public YourController(HttpContextAccessor contextAccessor)
{
    _contextAccessor = contextAccessor;
}

您必须使用该界面:

private readonly IHttpContextAccessor _contextAccessor;

public YourController(IHttpContextAccessor contextAccessor)
{
    _contextAccessor = contextAccessor;
}
© www.soinside.com 2019 - 2024. All rights reserved.