Potrzebuję dostępu do prądu HttpContext
w metodzie statycznej lub usłudze narzędziowej.
W przypadku klasycznego ASP.NET MVC i System.Web
po prostu używałbym HttpContext.Current
statycznego dostępu do kontekstu. Ale jak to zrobić w ASP.NET Core?
c#
asp.net-core
maxswitcher
źródło
źródło
IHttpContextAccessor
byłoby to dostępne tylko w miejscach, w których kontener DI rozwiązuje instancję.CallContextServiceLocator
, aby rozwiązać usługę, nawet z nie-DI-wtryskiwanego przykład:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. W praktyce to super, jeśli można tego uniknąć :)Nekromancja.
TAK, MOŻESZ
Tajna wskazówka dla tych, którzy migrują w dużych ilościach
dżonkifragmenty (westchnienie, wpadka Freuda) kodu.Poniższa metoda jest złym hackiem, który aktywnie angażuje się w wykonywanie ekspresowej pracy szatana (w oczach twórców frameworka .NET Core), ale działa :
W
public class Startup
dodać właściwość
Następnie dodaj singleton IHttpContextAccessor do DI w ConfigureServices.
Następnie w Konfiguruj
dodaj parametr DI
IServiceProvider svp
, więc metoda wygląda następująco:Następnie utwórz klasę zastępczą dla System.Web:
Teraz w programie Configure, gdzie dodano
IServiceProvider svp
, zapisz tego dostawcę usług w zmiennej statycznej „ServiceProvider” w właśnie utworzonej klasie fikcyjnej System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)i ustaw HostingEnvironment.IsHosted na true
to jest w zasadzie to, co zrobił System.Web, tyle że nigdy go nie widziałeś (myślę, że zmienna została zadeklarowana jako wewnętrzna, a nie publiczna).
Podobnie jak w ASP.NET Web-Forms, otrzymasz NullReference, gdy próbujesz uzyskać dostęp do HttpContext, gdy nie ma go, na przykład
Application_Start
w global.asax.Podkreślam jeszcze raz, działa to tylko wtedy, gdy faktycznie dodałeś
tak jak napisałem, powinieneś.
Witamy we wzorcu ServiceLocator we wzorcu DI;)
W przypadku zagrożeń i skutków ubocznych zapytaj swojego lekarza lub farmaceutę - lub zapoznaj się z źródłami .NET Core na github.com/aspnet i przeprowadź testy.
Być może łatwiejszą w utrzymaniu metodą byłoby dodanie tej klasy pomocniczej
A następnie wywołanie HttpContext.Configure w Startup-> Configure
źródło
Aby dodać do innych odpowiedzi ...
W ASP.NET 2.1 Rdzeń, tam metodę rozszerzenia , które zarejestruje z prawidłowym życia:
AddHttpContextAccessor
IHttpContextAccessor
źródło
Najbardziej legalnym sposobem, jaki wymyśliłem, było wstrzyknięcie IHttpContextAccessor do Twojej statycznej implementacji w następujący sposób:
Następnie przypisanie IHttpContextAccessor w Startup Configure powinno wykonać zadanie.
Chyba należy również zarejestrować singleton usługi:
źródło
Zgodnie z tym artykułem: Dostęp do HttpContext poza składnikami platformy w ASP.NET Core
Następnie:
Następnie:
Możesz go używać w ten sposób:
źródło
W Startup
W kontrolerze
źródło