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


137

我开始将asp.net核心RC1项目转换为RC2,并遇到了目前IHttpContextAccessor无法解决的问题。

为了简单起见,我使用Visual Studio Template创建了新的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。RC1中的Everething效果很好。那么,它怎么应该在RC2中呢?


这个问题已经在aspnet GitHub存储库中进行了讨论:github.com/aspnet/Hosting/issues/793
Chris Pickford

Answers:


217

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

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
这是可行的。同样的故事services.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP '16

6
关于适当的范围,我们是否有官方建议?它应该是SingletonScoped还是Transient
Mark Vincze 2016年

9
嗯,这里讨论了这个问题,许多人证实它可以安全存在Singletongithub.com/aspnet/Hosting/issues/793
Mark Vincze

这样做时,出现此错误:InvalidOperationException: Cannot consume scoped service。任何想法 ?
Robouste

1
请参阅有关使用提供的扩展方法的下一个答案,该方法services.AddHttpContextAccessor()是Microsoft首选/推荐的。
马丁·布利斯

120

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

services.AddHttpContextAccessor();

这等效于:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.