InvalidOperationException: невозможно разрешить службу для типа «Microsoft.AspNetCore.Http.IHttpContextAccessor»


137

Я начал преобразовывать свой основной проект RC1 asp.net в RC2 и столкнулся с проблемой, которая сейчас IHttpContextAccessorне решена.

Для простоты я создал новый проект ASP.NET RC2 с использованием шаблона Visual Studio ASP.NET Core Web Application (.Net Framework). Затем я добавил конструктор для HomeController, шаблон которого создал для меня.

public HomeController(IHttpContextAccessor accessor)
{
}

И после запуска приложения я получаю следующую ошибку:

InvalidOperationException: невозможно разрешить службу для типа «Microsoft.AspNetCore.Http.IHttpContextAccessor» при попытке активировать «TestNewCore.Controllers.HomeController». в Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, тип Type, тип requiredBy, логическое значение isDefaultParameterRequired)

В моем реальном приложении мне нужно IHttpContextAccessorнайти собственный класс обслуживания для получения доступа к _contextAccessor.HttpContext.Authenticationи _contextAccessor.HttpContext.User. Все работает нормально в RC1. Так как это может быть в RC2?


Эта проблема обсуждалась в репозитории aspnet GitHub здесь: github.com/aspnet/Hosting/issues/793
Крис Пикфорд,

Ответы:


217

IHttpContextAccessor больше не подключен по умолчанию, вы должны зарегистрировать его самостоятельно

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
Это сработало. Также та же история сservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP

6
Есть ли у нас официальная рекомендация о том, каков надлежащий охват? Должна ли она быть Singleton, Scopedили Transient?
Марк Винч

9
Ах, это обсуждается здесь, и несколько человек подтверждают, что это может быть безопасно Singleton. github.com/aspnet/Hosting/issues/793
Марк Винче

При выполнении этого, я получил эту ошибку: InvalidOperationException: Cannot consume scoped service. Любая идея ?
Робуст

1
Пожалуйста, смотрите следующий ответ об использовании предоставленного метода расширения, services.AddHttpContextAccessor()который является предпочтительным / рекомендованным Microsoft.
Мартин Блисс

120

Начиная с .NET Core 2.1, был добавлен метод расширения для правильной регистрации IHttpContextAccessorв качестве одиночного. См. Добавление помощника для регистрации IHttpContextAccessor # 947 . Просто добавьте в ваш ConfigureServices()метод следующее:

services.AddHttpContextAccessor();

Это эквивалентно:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.