Je travaille avec des outils indépendants de WebForms / MVC et je dois obtenir une instance de HttpContext
avec une référence à un objet HttpContextBase
. Je ne peux pas utiliser HttpContext.Current
car j'ai également besoin de cette fonction pour travailler de manière asynchrone ( HttpContext.Current
retours null
lors d'une requête asynchrone). Je suis au courant de HttpContextWrapper
, mais dans le mauvais sens.
Réponses
Trop de publicités?La façon la plus simple est d'obtenir l'application, ApplicationInstance
, et l'utilisation de son Context
de la propriété:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(merci à Ismaël Smyrnow qui a noté cela dans les commentaires)
Réponse originale à cette question:
Vous pouvez, surtout si l' HttpContextBase
exemple vous avez été remis est de type HttpContextWrapper
au moment de l'exécution. L'exemple suivant illustre comment vous pouvez le faire. Il suppose que vous avez une méthode appelée Foo
qui accepte contexte HttpContextBase
mais doit ensuite appeler une méthode dans un tiers de l'assemblée (que vous pouvez ne pas avoir la bonne fortune de le modifier) qui s'attend à ce que le contexte de taper comme HttpContext
.
void Foo(HttpContextBase context)
{
var app = (HttpApplication) context.GetService(typeof(HttpApplication));
ThirdParty.Bar.Baz(app.Context);
}
// Somewhere in assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:
static void Baz(HttpContext context) { /* ... */ }
HttpContextBase
a une méthode appelée GetService
comme un résultat de soutien IServiceProvider
. L' GetService
de contourner HttpContextWrapper
des délégués à l' GetService
de la mise en œuvre de la enveloppé HttpContext
de l'instance. L' GetService
de la mise en œuvre de l' HttpContext
vous permet de requête pour les suspects habituels comme HttpApplication
, HttpRequest
, HttpResponse
et ainsi de suite. Il arrive qu' HttpApplication
a une propriété appelée Contexte et qui retourne une instance de HttpContext
. Donc, on obtient à la enveloppé HttpContext
exemple en posant HttpContextBase
pour HttpApplication
par GetService
, suivie par la lecture de l' Context
de la propriété de l'retourné HttpApplication
de l'instance.
Contrairement aux HttpContextBase
, GetService
n'apparaît pas comme un membre du public de l' HttpContext
mais c'est parce qu' HttpContext
implémente IServiceProvider.GetService
explicitement tout HttpContextBase
ne le fait pas.
Gardez à l'esprit qu' Foo
n'est plus vérifiable, car il repose sur la possibilité de déballer le sous-jacent HttpContext
cours de l'essai et qui est à peu près impossible de faux/stub en premier lieu. Le point de cette réponse, cependant, est de répondre à la question, "Comment puis-je obtenir un HttpContext objet de HttpContextBase?", littéralement. L'illustré technique est utile dans les situations où vous vous trouvez pris en sandwich entre les composants dont vous n'avez pas le luxe de les modifier.
Vous ne pouvez pas
Le but de HttpContextBase est d’abstraire la dépendance à la classe concrète HttpContext. Bien qu'il puisse contenir un HttpContext concret (comme c'est le cas avec httpContextWrapper), d'autres implémentations peuvent n'avoir absolument rien à voir avec HttpContext.
Votre meilleure option est de définir une fabrique abstraite personnalisée pouvant obtenir une base de données HttpContextBase, car vous pouvez toujours inclure un contexte concret dans un HttpContextWrapper.