152 votes

Comment puis-je obtenir un objet HttpContext de HttpContextBase dans ASP.NET MVC 1?

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.

242voto

Atif Aziz Points 16967

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.

31voto

Marc Chouteau Points 113

Vous pouvez,

 var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
 

14voto

Mark Seemann Points 102767

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X