InvalidOperationException: no se puede resolver el servicio para el tipo 'Microsoft.AspNetCore.Http.IHttpContextAccessor'

137

Comencé a convertir mi proyecto asp.net core RC1 a RC2 y enfrenté un problema que ahora IHttpContextAccessorno se resuelve.

En aras de la simplicidad, creé un nuevo proyecto ASP.NET RC2 usando Visual Studio Template ASP.NET Core Web Application (.Net Framework). Luego agregué el constructor de HomeController que plantilla creó para mí.

public HomeController(IHttpContextAccessor accessor)
{
}

Y después de iniciar la aplicación, recibo el siguiente error:

InvalidOperationException: no se puede resolver el servicio para el tipo 'Microsoft.AspNetCore.Http.IHttpContextAccessor' al intentar activar 'TestNewCore.Controllers.HomeController'. Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

En mi aplicación real en Necesito resolver IHttpContextAccessoren mi propia clase de servicio para obtener acceso a _contextAccessor.HttpContext.Authenticationy a _contextAccessor.HttpContext.User. Everething funciona bien en RC1. Entonces, ¿cómo puede suponer estar en RC2?

YuriyP
fuente
Este tema se ha discutido en el repositorio de aspnet GitHub aquí: github.com/aspnet/Hosting/issues/793
Chris Pickford el

Respuestas:

217

IHttpContextAccessor ya no está conectado de forma predeterminada, debe registrarlo usted mismo

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
fuente
77
Está trabajado. También misma historia conservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP
66
¿Tenemos una recomendación oficial sobre cuál es el alcance adecuado? ¿Debería ser Singleton, Scopedo Transient?
Mark Vincze
9
Ah, se discute aquí, y varias personas verifican que puede ser seguro Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze
Al hacer eso, me dio este mensaje: InvalidOperationException: Cannot consume scoped service. Alguna idea ?
Robouste
1
Consulte la siguiente respuesta sobre el uso del método de extensión proporcionado services.AddHttpContextAccessor()que Microsoft prefiere / recomienda.
Martin Bliss
120

A partir de .NET Core 2.1 hay un método de extensión que se ha agregado para registrar correctamente un IHttpContextAccessorcomo un singleton. Consulte Agregar ayuda para registrar IHttpContextAccessor # 947 . Simplemente agregue lo siguiente en su ConfigureServices()método:

services.AddHttpContextAccessor();

Esto es equivalente a:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
CalC
fuente