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.

139
demandé sur Atif Aziz 2010-01-02 20:10:42

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.

230
répondu Atif Aziz 2017-05-23 11:47:32

Vous pouvez

var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
28
répondu Marc Chouteau 2012-05-21 13:24:15

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.

14
répondu Mark Seemann 2017-03-29 21:40:02