Le moyen le plus simple est d'obtenir l'application ApplicationInstance
et d'utiliser sa Context
propriété:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(merci à Ishmael Smyrnow qui l'a noté dans les commentaires)
Réponse originale:
Vous pouvez, en particulier si l' HttpContextBase
instance qui vous a été remise est de type HttpContextWrapper
au moment de l'exécution. L'exemple suivant illustre comment procéder. Cela suppose que vous ayez une méthode appelée Foo
qui accepte le contexte comme, HttpContextBase
mais qui doit ensuite appeler une méthode dans un assembly tiers (que vous n'aurez peut-être pas la chance de modifier) qui attend que le contexte soit tapé 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
à la suite de la prise en charge IServiceProvider
. Le GetService
remplacement des HttpContextWrapper
délégués à l' GetService
implémentation de l' HttpContext
instance encapsulée . La GetService
mise en œuvre de HttpContext
vous permet d'interroger des suspects habituels comme HttpApplication
, HttpRequest
, HttpResponse
et ainsi de suite. Il se trouve qu'il HttpApplication
possède une propriété appelée Context et qui renvoie une instance de HttpContext
. Ainsi , on obtient à l'enveloppées par HttpContext
exemple en demandant HttpContextBase
à HttpApplication
travers GetService
puis en lisant la Context
propriété du revenu par HttpApplication
exemple.
Contrairement à HttpContextBase
, GetService
n'apparaît pas comme un membre public de, HttpContext
mais c'est parce qu'il HttpContext
implémente l' IServiceProvider.GetService
explicité alors que ce HttpContextBase
n'est pas le cas.
Gardez à l'esprit que ce Foo
n'est plus testable car il repose sur la capacité de dérouler le sous-jacent HttpContext
pendant les tests et qu'il est pratiquement impossible de simuler / stub en premier lieu. Le but de cette réponse, cependant, est de répondre à la question «Comment puis-je obtenir un objet HttpContext à partir de HttpContextBase?», Littéralement . La technique illustrée est utile dans les situations où vous vous retrouvez pris en sandwich entre des composants que vous n'avez pas forcément le luxe de modifier.
context.ApplicationInstance.Context
?Http*Base
variations renvoyées parHttpContextBase
. : P Je vais mettre à jour la réponse.Vous pouvez,
la source
Vous ne pouvez pas.
Le but entier de
HttpContextBase
est d'abstraire la dépendance à laHttpContext
classe concrète . Bien qu'il puisse contenir un élément concretHttpContext
(comme c'est le cas avechttpContextWrapper
) , d'autres implémentations peuvent n'avoir absolument rien à voir avecHttpContext
.Votre meilleure option est de définir une fabrique abstraite personnalisée qui peut obtenir un
HttpContextBase
pour vous, car vous pouvez toujours envelopper un bétonHttpContext
dans un fichierHttpContextWrapper
.la source
IHttpHandler
implémentations, vous finissez par devoir mettre un certain nombre d'abstractions dans (wrappers de réponse) juste pour vos tests unitaires, ce qui ne semble pas correct mais finit par être la seule option.