2016-05-22 12 views
45

Zacząłem konwertować mój główny projekt RC1 asp.net na RC2 i napotkałem problem, że teraz IHttpContextAccessor nie został rozwiązany.InvalidOperationException: Nie można rozpoznać usługi dla typu "Microsoft.AspNetCore.Http.IHttpContextAccessor"

Dla uproszczenia stworzyłem nowy projekt ASP.NET RC2 przy użyciu szablonu Visual Studio Template ASP.NET Core Web Application (.Net Framework). Następnie dodałem konstruktor dla HomeController, który szablon został stworzony dla mnie.

public HomeController(IHttpContextAccessor accessor) 
{ 
} 

A potem zacznę aplikację otrzymam kolejny błąd:

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)

W mojej prawdziwej aplikacji muszę rozwiązać IHttpContextAccessor w moim klasy usługi dla uzyskania dostępu do _contextAccessor.HttpContext.Authentication i _contextAccessor.HttpContext.User. Everething działa poprawnie w RC1. Jak więc może być w RC2?

Odpowiedz

79

IHttpContextAccessor nie jest już okablowany domyślnie trzeba go zarejestrować się

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

Jest on pracował. Również ta sama historia z 'services.AddScoped ()' – YuriyP

+2

Czy mamy oficjalne zalecenia dotyczące właściwego zakresu? Czy powinien to być "Singleton", "Scoped" lub "Transient"? –

+5

Ah to jest omawiane tutaj, a wiele osób sprawdza, czy bezpiecznie może być "Singleton". https://github.com/aspnet/Hosting/issues/793 –

3

As Rdzenia .NET 2.1 nie jest metoda rozszerzenie, które zostały dodane, aby poprawnie zarejestrować IHttpContextAccessor jako Singleton. Zobacz Add helper to register IHttpContextAccessor #947. Wystarczy dodać co następuje w sposób ConfigureServices():

services.AddHttpContextAccessor(); 

Jest to odpowiednik:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
Powiązane problemy