Najprostszym sposobem jest pobranie aplikacji ApplicationInstance
i wykorzystanie jej Context
właściwości:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(podziękowania dla Ishmaela Smyrnow, który zauważył to w komentarzach)
Oryginalna odpowiedź:
Możesz, zwłaszcza jeśli przekazana HttpContextBase
instancja jest typu HttpContextWrapper
w czasie wykonywania. Poniższy przykład ilustruje, jak możesz to zrobić. Zakłada się, że masz metodę o nazwie, Foo
która akceptuje kontekst jako, HttpContextBase
ale następnie musi wywołać metodę w zestawie innej firmy (której możesz nie mieć szczęścia do zmodyfikowania), która oczekuje, że kontekst zostanie wpisany jako 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
ma metodę wywołaną GetService
w wyniku wsparcia IServiceProvider
. GetService
Ominięcie HttpContextWrapper
delegatów do GetService
realizacji zawiniętego HttpContext
instancji. GetService
Implementacja HttpContext
pozwala na zapytania dla Podejrzani jak HttpApplication
, HttpRequest
, HttpResponse
i tak dalej. Tak się składa, że HttpApplication
ma właściwość o nazwie Context, która zwraca instancję HttpContext
. Tak więc można dostać się do opakowanej HttpContext
instancji, prosząc HttpContextBase
o HttpApplication
via, GetService
a następnie odczytując Context
właściwość zwróconej HttpApplication
instancji.
W przeciwieństwie do HttpContextBase
, GetService
nie pojawia się jako publiczny członek, HttpContext
ale to dlatego, że HttpContext
implementuje IServiceProvider.GetService
jawność, a HttpContextBase
nie.
Należy pamiętać, że Foo
nie jest to już możliwe do przetestowania, ponieważ polega na możliwości rozpakowania elementu bazowego HttpContext
podczas testowania i jest prawie niemożliwe do sfałszowania / zablokowania w pierwszej kolejności. Jednak celem tej odpowiedzi jest dosłownie odpowiedź na pytanie „Jak uzyskać obiekt HttpContext z HttpContextBase?” . Zilustrowana technika jest przydatna w sytuacjach, w których znajdujesz się wciśnięty między komponenty, których modyfikacja niekoniecznie jest luksusowa.
context.ApplicationInstance.Context
?Http*Base
zwróconych przez nas odmianHttpContextBase
. : P Zaktualizuję odpowiedź.Możesz,
źródło
Nie możesz.
Celem programu
HttpContextBase
jest oderwanie od zależności od konkretnejHttpContext
klasy. Chociaż może zawierać konkretHttpContext
(tak jak w przypadkuhttpContextWrapper
) , inne implementacje mogą nie mieć absolutnie nic wspólnegoHttpContext
.Najlepszą opcją jest zdefiniowanie niestandardowej fabryki abstrakcyjnej, która może uzyskać
HttpContextBase
dla Ciebie, ponieważ zawsze możesz owinąć betonHttpContext
w plikHttpContextWrapper
.źródło
IHttpHandler
implementacje, kończysz z koniecznością umieszczenia dodatkowej liczby abstrakcji w (opakowaniach odpowiedzi) tylko dla testów jednostkowych, co nie wydaje się właściwe, ale w końcu jest jedyną opcją.