A maneira mais simples é obter o aplicativo ApplicationInstance
e usar sua Context
propriedade:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(obrigado a Ishmael Smyrnow, que observou isso nos comentários)
Resposta original:
Você pode, especialmente se a HttpContextBase
instância que você recebeu é do tipo HttpContextWrapper
em tempo de execução. O exemplo a seguir ilustra como você pode fazer isso. Supõe que você tenha um método chamado Foo
que aceita o contexto, HttpContextBase
mas que precisa chamar um método em um assembly de terceiros (que talvez você não tenha a sorte de modificar) que espera que o contexto seja digitado 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
tem um método chamado GetService
como resultado do suporte IServiceProvider
. A GetService
substituição de HttpContextWrapper
delegados para a GetService
implementação da HttpContext
instância agrupada . A GetService
implementação do HttpContext
permite que você consulta para os suspeitos habituais, como HttpApplication
, HttpRequest
, HttpResponse
e assim por diante. Acontece que HttpApplication
tem uma propriedade chamada Context e que retorna uma instância de HttpContext
. Assim se obtém na envolto HttpContext
exemplo, pedindo HttpContextBase
para HttpApplication
via GetService
seguido pela leitura da Context
propriedade do retornado HttpApplication
instância.
Ao contrário HttpContextBase
, GetService
não aparece como um membro público de, HttpContext
mas isso ocorre porque HttpContext
implementa IServiceProvider.GetService
explicitamente enquanto HttpContextBase
não.
Lembre-se de que Foo
não é mais testável porque depende de ser capaz de desembrulhar o subjacente HttpContext
durante o teste e que é quase impossível de falsificar / stub em primeiro lugar. O objetivo desta resposta, no entanto, é abordar a pergunta "Como obtenho um objeto HttpContext do HttpContextBase?", Literalmente . A técnica ilustrada é útil nas situações em que você se encontra imprensado entre componentes que não tem necessariamente o luxo de modificar.