Am einfachsten ist es, die Anwendung ApplicationInstance
abzurufen und ihre Context
Eigenschaft zu verwenden:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(Danke an Ishmael Smyrnow, der dies in den Kommentaren vermerkt hat)
Ursprüngliche Antwort:
Dies ist insbesondere dann möglich, wenn die übergebene HttpContextBase
Instanz HttpContextWrapper
zur Laufzeit vom Typ ist . Das folgende Beispiel zeigt, wie Sie dies tun können. Angenommen, Sie haben eine Methode namens Foo
, die den Kontext als akzeptiert HttpContextBase
, dann aber eine Methode in einer Assembly eines Drittanbieters aufrufen muss (die Sie möglicherweise nicht ändern können), die erwartet, dass der Kontext als eingegeben wird 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
hat eine Methode GetService
als Ergebnis der Unterstützung aufgerufen IServiceProvider
. Das GetService
Überschreiben von HttpContextWrapper
Delegaten zur GetService
Implementierung der umschlossenen HttpContext
Instanz. Die GetService
Implementierung HttpContext
ermöglicht es Ihnen , zu Abfrage für üblich Verdächtigen wie HttpApplication
, HttpRequest
, HttpResponse
und so weiter. Es ist einfach so, dass HttpApplication
es eine Eigenschaft namens Context hat, die eine Instanz von zurückgibt HttpContext
. Man gelangt also zur umschlossenen HttpContext
Instanz, indem man HttpContextBase
nach HttpApplication
via fragt und GetService
anschließend die Context
Eigenschaft der zurückgegebenen HttpApplication
Instanz liest .
Im Gegensatz zu HttpContextBase
, GetService
erscheint nicht als ein öffentliches Mitglied , HttpContext
aber das ist , weil HttpContext
Geräte IServiceProvider.GetService
explicity während HttpContextBase
nicht.
Denken Sie daran, dass dies Foo
nicht mehr testbar ist, da es darauf ankommt, dass der Basiswert HttpContext
während des Tests ausgepackt werden kann und dass es nahezu unmöglich ist, ihn zu fälschen / zu stummeln . Der Sinn dieser Antwort besteht jedoch darin, die Frage „Wie erhalte ich ein HttpContext-Objekt von HttpContextBase?“ Wörtlich zu beantworten . Die dargestellte Technik ist in Situationen nützlich, in denen Sie sich zwischen Komponenten befinden, für deren Modifizierung Sie nicht unbedingt den Luxus haben.
context.ApplicationInstance.Context
?Http*Base
Variationen verpasst habe, die von zurückgegeben wurdenHttpContextBase
. : P Ich werde die Antwort aktualisieren.Sie können,
quelle
Das kannst du nicht.
Der ganze Zweck von
HttpContextBase
ist es, die Abhängigkeit von der konkretenHttpContext
Klasse zu abstrahieren . Während es einen konkreten Inhalt enthalten kannHttpContext
(wie dies bei der Fall isthttpContextWrapper
) , haben andere Implementierungen möglicherweise absolut nichts damit zu tunHttpContext
.Am besten definieren Sie eine benutzerdefinierte abstrakte Fabrik, die eine
HttpContextBase
für Sie erhalten kann, da Sie jederzeit einen BetonHttpContext
in eine einwickeln könnenHttpContextWrapper
.quelle
IHttpHandler
Implementierungen zu testen , müssen Sie nur für Ihre Unit-Tests eine ganze Reihe von Abstraktionen in (Response-Wrapper) einfügen, was sich nicht richtig anfühlt, aber letztendlich die einzige Option ist.