J'ai besoin d'accéder au courant HttpContext
dans une méthode statique ou un service utilitaire.
Avec ASP.NET MVC classique et System.Web
, je voudrais simplement utiliser HttpContext.Current
pour accéder au contexte de manière statique. Mais comment faire cela dans ASP.NET Core?
c#
asp.net-core
maxswitcher
la source
la source
IHttpContextAccessor
ne serait disponible que dans les endroits où le conteneur DI résout l'instance.CallContextServiceLocator
pour résoudre un service, même d'une instance à injection non-DI:CallContextServiceLocator.Locator.ServiceProvider.GetService<IHttpContextAccessor>()
. En pratique, c'est une bonne chose si vous pouvez l'éviter :)Nécromancie.
OUI VOUS POUVEZ Astuce
secrète pour les grands migrants
jonquesmorceaux (soupir, glissement freudien) de code.La méthode suivante est un mauvais anthrax d'un hack qui est activement engagé dans la réalisation du travail express de satan (aux yeux des développeurs du framework .NET Core), mais cela fonctionne :
Dans
public class Startup
ajouter une propriété
Et puis ajoutez un singleton IHttpContextAccessor à DI dans ConfigureServices.
Puis dans Configure
ajoutez le paramètre DI
IServiceProvider svp
, de sorte que la méthode ressemble à:Ensuite, créez une classe de remplacement pour System.Web:
Maintenant, dans Configure, où vous avez ajouté le
IServiceProvider svp
, enregistrez ce fournisseur de services dans la variable statique «ServiceProvider» dans la classe factice qui vient d'être créée System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)et définissez HostingEnvironment.IsHosted sur true
c'est essentiellement ce que System.Web a fait, juste que vous ne l'avez jamais vu (je suppose que la variable a été déclarée comme interne au lieu de publique).
Comme dans les formulaires Web ASP.NET, vous obtiendrez un NullReference lorsque vous essayez d'accéder à un HttpContext alors qu'il n'y en a pas, comme c'était le cas
Application_Start
dans global.asax.Je souligne encore une fois, cela ne fonctionne que si vous avez réellement ajouté
comme je l'ai écrit tu devrais.
Bienvenue dans le modèle ServiceLocator dans le modèle DI;)
Pour les risques et les effets secondaires, demandez à votre médecin ou pharmacien résident - ou étudiez les sources de .NET Core sur github.com/aspnet , et effectuez des tests.
Peut-être qu'une méthode plus maintenable consisterait à ajouter cette classe d'assistance
Et puis en appelant HttpContext.Configure dans Startup-> Configure
la source
Juste pour ajouter aux autres réponses ...
Dans ASP.NET Core 2.1, il existe la
AddHttpContextAccessor
méthode d'extension , qui enregistrera leIHttpContextAccessor
avec la durée de vie correcte:la source
La manière la plus légitime que j'ai trouvée était d'injecter IHttpContextAccessor dans votre implémentation statique comme suit:
Ensuite, l'affectation de IHttpContextAccessor dans le Startup Configure devrait faire le travail.
Je suppose que vous devriez également avoir besoin d'enregistrer le service singleton:
la source
Selon cet article: Accéder à HttpContext en dehors des composants du framework dans ASP.NET Core
Ensuite:
Ensuite:
Vous pouvez l'utiliser comme ceci:
la source
Au démarrage
Dans le contrôleur
la source