InvalidOperationException: nie można rozpoznać usługi dla typu „Microsoft.AspNetCore.Http.IHttpContextAccessor”


137

Zacząłem konwertować mój projekt rdzenia RC1 asp.net do RC2 i napotkałem problem, który teraz IHttpContextAccessornie został rozwiązany.

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

public HomeController(IHttpContextAccessor accessor)
{
}

A po uruchomieniu aplikacji pojawia się kolejny błąd:

InvalidOperationException: nie można rozpoznać usługi typu „Microsoft.AspNetCore.Http.IHttpContextAccessor” podczas próby aktywacji „TestNewCore.Controllers.HomeController”. в Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

W mojej prawdziwej aplikacji muszę rozwiązać IHttpContextAccessorwe własnej klasie usług dostęp do _contextAccessor.HttpContext.Authenticationi do _contextAccessor.HttpContext.User. Wszystko działa dobrze w RC1. Jak więc może być w RC2?


Ten problem został omówiony w repozytorium aspnet GitHub tutaj: github.com/aspnet/Hosting/issues/793
Chris Pickford

Odpowiedzi:


217

IHttpContextAccessor nie jest już domyślnie podłączony, musisz go zarejestrować samodzielnie

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
To działa. Również ta sama historia zservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP

6
Czy mamy oficjalne zalecenia dotyczące prawidłowego zakresu? Powinien być Singleton, Scopedczy Transient?
Mark Vincze,

9
Ach, jest to omówione tutaj i wiele osób potwierdza, że ​​może to być bezpieczne Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze

Kiedy to zrobi, mam ten błąd: InvalidOperationException: Cannot consume scoped service. Dowolny pomysł ?
Robouste

1
Zobacz następną odpowiedź dotyczącą korzystania z udostępnionej metody rozszerzenia, services.AddHttpContextAccessor()która jest preferowana / zalecana przez firmę Microsoft.
Martin Bliss

120

Od wersji .NET Core 2,1 istnieje metoda rozszerzenia, która została dodana w celu prawidłowego zarejestrowania IHttpContextAccessorjako singleton. Zobacz Dodawanie pomocnika, aby zarejestrować IHttpContextAccessor # 947 . Po prostu dodaj do swojej ConfigureServices()metody:

services.AddHttpContextAccessor();

Jest to równoważne z:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.