Ich muss auf den Strom HttpContext
in einer statischen Methode oder einem Dienstprogramm zugreifen .
Mit klassischem ASP.NET MVC und System.Web
würde ich nur verwenden HttpContext.Current
, um statisch auf den Kontext zuzugreifen. Aber wie mache ich das in ASP.NET Core?
c#
asp.net-core
Maxswitcher
quelle
quelle
IHttpContextAccessor
dies nur an Stellen verfügbar ist, an denen der DI-Container die Instanz auflöst.CallContextServiceLocator
, um einen Dienst aufzulösen, selbst von einer Instanz ohne DI-Injektion :CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. In der Praxis ist es eine großartige Sache, wenn Sie es vermeiden können :)Nekromantie.
JA, SIE KÖNNEN
Geheimtipp für diejenigen, die groß migrieren
JunksBrocken (Seufzer, Freudscher Ausrutscher) des Codes.Die folgende Methode ist ein böser Karbunkel eines Hacks, der aktiv an der Ausführung der Expressarbeit von Satan beteiligt ist (in den Augen von .NET Core-Framework-Entwicklern), aber sie funktioniert :
Im
public class Startup
Fügen Sie eine Eigenschaft hinzu
Fügen Sie dann DI in ConfigureServices einen Singleton-IHttpContextAccessor hinzu.
Dann in Konfigurieren
Fügen Sie den DI-Parameter hinzu
IServiceProvider svp
, damit die Methode wie folgt aussieht:Erstellen Sie als Nächstes eine Ersatzklasse für System.Web:
IServiceProvider svp
Speichern Sie nun in Configure, wo Sie den hinzugefügt haben , diesen Dienstanbieter in der statischen Variablen "ServiceProvider" in der gerade erstellten Dummy-Klasse System.Web.HttpContext (System.Web.HttpContext.ServiceProvider).und setzen Sie HostingEnvironment.IsHosted auf true
Dies ist im Wesentlichen das, was System.Web getan hat, nur dass Sie es nie gesehen haben (ich denke, die Variable wurde als intern statt öffentlich deklariert).
Wie in ASP.NET Web-Forms erhalten Sie eine NullReference, wenn Sie versuchen, auf einen HttpContext zuzugreifen, wenn keiner vorhanden ist, wie er früher
Application_Start
in global.asax enthalten war.Ich betone noch einmal, das funktioniert nur, wenn Sie tatsächlich hinzugefügt haben
wie ich dir geschrieben habe solltest du.
Willkommen beim ServiceLocator-Muster innerhalb des DI-Musters;)
Fragen Sie Ihren Arzt oder Apotheker nach Risiken und Nebenwirkungen - oder untersuchen Sie die Quellen von .NET Core unter github.com/aspnet und führen Sie einige Tests durch.
Vielleicht wäre eine wartbarere Methode das Hinzufügen dieser Hilfsklasse
Rufen Sie dann HttpContext.Configure unter Startup-> Configure auf
quelle
Nur um die anderen Antworten zu ergänzen ...
In ASP.NET Core 2.1 gibt es die
AddHttpContextAccessor
Erweiterungsmethode ,IHttpContextAccessor
mit der die mit der richtigen Lebensdauer registriert wird :quelle
Der legitimste Weg, den ich gefunden habe, war das Einfügen von IHttpContextAccessor in Ihre statische Implementierung wie folgt:
Das Zuweisen des IHttpContextAccessor in der Startkonfiguration sollte dann den Job erledigen.
Ich denke, Sie sollten auch den Dienst Singleton registrieren müssen:
quelle
Gemäß diesem Artikel: Zugriff auf HttpContext außerhalb von Framework-Komponenten in ASP.NET Core
Dann:
Dann:
Sie können es so verwenden:
quelle
Im Start
Im Controller
quelle