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, тип типу, тип необхіднийBy, булевий isDefaultParameterRequired)

У моєму реальному застосуванні мені потрібно вирішити IHttpContextAccessorу власному класі обслуговування для отримання доступу до _contextAccessor.HttpContext.Authenticationта до _contextAccessor.HttpContext.User. Everething чудово працює в RC1. Тож як можна припустити перебувати в RC2?


Цю проблему обговорювали у сховищі aspnet GitHub тут: github.com/aspnet/Hosting/isissue/793
Кріс Пікфорд,

Відповіді:


217

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

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
Це працює. Також та сама історія зservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
ЮрійП

6
Чи є у нас офіційна рекомендація щодо того, що таке правильна сфера застосування? Це повинно бути Singleton, Scopedчи Transient?
Марк Вінче

9
Ну, це обговорюється тут, і багато людей підтверджують, що це може бути безпечно Singleton. github.com/aspnet/Hosting/isissue/793
Марк

При виконанні цього, я отримав цю помилку: InvalidOperationException: Cannot consume scoped service. Будь-яка ідея?
Robouste

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.