Comment puis-je obtenir un objet HttpContext de HttpContextBase dans ASP.NET MVC 1?
Je travaille avec des outils WebForms/MVC-agnostic, et j'ai besoin d'obtenir une instance de HttpContext
étant donné une référence à un objet HttpContextBase
. Je ne peux pas utiliser HttpContext.Current
car j'ai besoin que cela fonctionne aussi de manière asynchrone (HttpContext.Current
renvoie null
lors d'une requête asynchrone). Je suis au courant de HttpContextWrapper
, mais va dans le mauvais sens.
3 réponses
La façon La plus simple est d'obtenir l'application, ApplicationInstance
, et l'utilisation de son Context
propriété:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(Merci à Ismael Smyrnow qui a noté cela dans les commentaires)
Réponse originale:
, Vous pouvez, surtout si la 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. Cela suppose que vous avez une méthode appelée Foo
qui accepte le contexte comme HttpContextBase
mais alors besoin d'appeler une méthode dans un assembly tiers (que vous n'avez peut-être pas la chance de modifier) qui s'attend à ce que le contexte soit tapé 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
. Le GetService
override de HttpContextWrapper
délègue à l'implémentation GetService
de l'instance HttpContext
encapsulée. L'implémentation GetService
de HttpContext
vous permet d'interroger les suspects habituels comme HttpApplication
, HttpRequest
, HttpResponse
et ainsi de suite. Il se trouve que HttpApplication
possède une propriété appelée Contexte et qui retourne une instance de HttpContext
. On obtient donc l'instance HttpContext
enveloppée en demandant HttpContextBase
pour HttpApplication
via GetService
suivi de la lecture de la propriété Context
de l'instance HttpApplication
retournée.
, Contrairement à HttpContextBase
, GetService
n'apparaît pas comme un membre du public de HttpContext
, mais c'est parce que HttpContext
implémente IServiceProvider.GetService
explicitement, tandis que HttpContextBase
ne l'est pas.
Gardez à l'esprit que Foo
n'est plus vérifiable, car il repose sur la possibilité de déballer le sous-jacent HttpContext
pendant les tests et qui est presque impossible à simuler/stub en premier lieu. Le point de cette réponse, cependant, est de répondre à la question, " Comment puis-je obtenir un objet HttpContext de HttpContextBase?", littéralement. La technique illustrée est utile dans les situations où vous vous trouvez pris en sandwich entre des composants que vous n'avez pas nécessairement le luxe de modifier.
Vous pouvez
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
Vous ne pouvez pas.
Tout le but de HttpContextBase
est d'abstraire la dépendance à la classe HttpContext
concrète. Alors qu'il peut contient un béton HttpContext
(comme c'est le cas avec httpContextWrapper
), d'autres implémentations peuvent avoir absolument rien à faire avec HttpContext
.
Votre meilleure option est de définir une usine abstraite personnalisée qui peut obtenir un HttpContextBase
pour vous, puisque vous pouvez toujours envelopper un HttpContext
concret dans un HttpContextWrapper
.