InvalidOperationException: Dienst für Typ 'Microsoft.AspNetCore.Http.IHttpContextAccessor' kann nicht aufgelöst werden.

137

Ich habe begonnen, mein asp.net-Kern-RC1-Projekt in RC2 zu konvertieren, und hatte ein Problem, das jetzt IHttpContextAccessornicht gelöst werden kann.

Der Einfachheit halber habe ich ein neues ASP.NET RC2-Projekt mit Visual Studio Template erstellt ASP.NET Core Web Application (.Net Framework). Dann habe ich einen Konstruktor für HomeController hinzugefügt, dessen Vorlage für mich erstellt wurde.

public HomeController(IHttpContextAccessor accessor)
{
}

Und nachdem ich die Bewerbung gestartet habe, erhalte ich den nächsten Fehler:

InvalidOperationException: Dienst für Typ 'Microsoft.AspNetCore.Http.IHttpContextAccessor' kann nicht aufgelöst werden, während versucht wird, 'TestNewCore.Controllers.HomeController' zu aktivieren. • Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Typ type, Type requiredBy, Boolean isDefaultParameterRequired)

In meiner realen Anwendung muss ich mich IHttpContextAccessorin meiner eigenen Serviceklasse auflösen , um Zugriff auf _contextAccessor.HttpContext.Authenticationund zu erhalten _contextAccessor.HttpContext.User. In RC1 funktioniert alles einwandfrei. Wie kann es also annehmen, in RC2 zu sein?

YuriyP
quelle
Dieses Problem wurde im aspnet GitHub-Repository hier besprochen: github.com/aspnet/Hosting/issues/793
Chris Pickford

Antworten:

217

IHttpContextAccessor ist standardmäßig nicht mehr verkabelt, Sie müssen es selbst registrieren

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Joe Audette
quelle
7
Es wird gearbeitet. Auch die gleiche Geschichte mitservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP
6
Haben wir eine offizielle Empfehlung zum richtigen Umfang? Sollte es sein Singleton, Scopedoder Transient?
Mark Vincze
9
Ah, es wird hier besprochen, und mehrere Personen überprüfen, ob es sicher sein kann Singleton. github.com/aspnet/Hosting/issues/793
Mark Vincze
Dabei habe ich folgende Fehlermeldung erhalten : InvalidOperationException: Cannot consume scoped service. Irgendeine Idee ?
Robouste
1
Weitere Informationen zur Verwendung der services.AddHttpContextAccessor()von Microsoft bevorzugten / empfohlenen Erweiterungsmethode finden Sie in der nächsten Antwort .
Martin Bliss
120

Ab .NET Core 2.1 wurde eine Erweiterungsmethode hinzugefügt, um eine korrekt IHttpContextAccessorals Singleton zu registrieren . Siehe Helfer hinzufügen, um IHttpContextAccessor # 947 zu registrieren . Fügen Sie Ihrer ConfigureServices()Methode einfach Folgendes hinzu :

services.AddHttpContextAccessor();

Dies entspricht:

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