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?

YuriyP
источник
Эта проблема обсуждалась в репозитории 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>();
CALC
источник