InvalidOperationException: Não foi possível resolver o serviço para o tipo 'Microsoft.AspNetCore.Http.IHttpContextAccessor'

137

Comecei a converter meu projeto RC1 do núcleo do asp.net em RC2 e enfrentei um problema que agora IHttpContextAccessornão foi resolvido.

Por uma questão de simplicidade, criei o novo projeto ASP.NET RC2 usando o Visual Studio Template ASP.NET Core Web Application (.Net Framework). Então, eu adicionei o construtor para o HomeController, que modelo criou para mim.

public HomeController(IHttpContextAccessor accessor)
{
}

E depois de iniciar o aplicativo, recebo o próximo erro:

InvalidOperationException: Não foi possível resolver o serviço para o tipo 'Microsoft.AspNetCore.Http.IHttpContextAccessor' enquanto tentava ativar 'TestNewCore.Controllers.HomeController'. Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Tipo de tipo, Tipo requiredBy, Boolean isDefaultParameterRequired)

Na minha aplicação real Preciso resolver IHttpContextAccessorem minha própria classe de serviço para obter acesso a _contextAccessor.HttpContext.Authenticatione _contextAccessor.HttpContext.User. Tudo funciona bem no RC1. Então, como ele pode estar no RC2?

YuriyP
fonte
Esta questão tem sido discutida na aspnet GitHub repositório aqui: github.com/aspnet/Hosting/issues/793
Chris Pickford

Respostas:

217

IHttpContextAccessor não está mais conectado por padrão, você deve registrá-lo

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
fonte
7
Está trabalhado. Também a mesma história comservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP
6
Temos uma recomendação oficial sobre qual é o escopo adequado? Deveria ser Singleton, Scopedou Transient?
Mark Vincze
9
Ah, isso é discutido aqui e várias pessoas confirmam que pode ser com segurança Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze
Ao fazer isso, eu tenho esse erro: InvalidOperationException: Cannot consume scoped service. Qualquer ideia ?
Robouste 23/09
1
Consulte a próxima resposta sobre o uso do método de extensão fornecido, services.AddHttpContextAccessor()preferido / recomendado pela Microsoft.
Martin Bliss
120

A partir do .NET Core 2.1, há um método de extensão que foi adicionado para registrar corretamente um IHttpContextAccessorcomo um singleton. Consulte Adicionar auxiliar para registrar o IHttpContextAccessor # 947 . Basta adicionar o seguinte no seu ConfigureServices()método:

services.AddHttpContextAccessor();

Isso é equivalente a:

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