2016-05-22 2 views
45

Я начал конвертировать мой RC4-проект asp.net в RC2 и столкнулся с проблемой, которую сейчас IHttpContextAccessor не разрешен.InvalidOperationException: Не удалось разрешить службу для типа «Microsoft.AspNetCore.Http.IHttpContextAccessor»

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

public HomeController(IHttpContextAccessor accessor) 
{ 
} 

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

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Http.IHttpContextAccessor' while attempting to activate 'TestNewCore.Controllers.HomeController'. в Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

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

ответ

79

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

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
+5

Он работал. Также такая же история с 'services.AddScoped ()' – YuriyP

+2

Есть ли у нас официальная рекомендация о том, что такое правильная область? Должны ли это быть «Singleton», «Scoped» или «Transient»? –

+5

О, это обсуждается здесь, и несколько человек проверяют, что это может быть безопасно «Singleton». https://github.com/aspnet/Hosting/issues/793 –

3

По состоянию на .NET 2.1 Ядра есть метод расширения, который был добавлен, чтобы правильно зарегистрировать IHttpContextAccessor как синглтон. См. Add helper to register IHttpContextAccessor #947. Просто добавьте следующим образом в вашем методе ConfigureServices():

services.AddHttpContextAccessor(); 

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

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();