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.
context.ApplicationInstance.Context
?Http*Base
variações retornadas porHttpContextBase
. : P vou atualizar a resposta.Você pode,
fonte
Você não pode.
O objetivo de todo
HttpContextBase
é abstrair a dependência daHttpContext
classe concreta . Embora possa conter um concretoHttpContext
(como é o casohttpContextWrapper
) , outras implementações podem não ter absolutamente nada a verHttpContext
.Sua melhor opção é definir um Abstract Factory personalizado que possa ser útil
HttpContextBase
para você, pois você sempre pode envolver um concretoHttpContext
em umHttpContextWrapper
.fonte
IHttpHandler
implementações, você precisa inserir um número ainda pequeno de abstrações (wrappers de resposta) apenas para seus testes de unidade, o que não parece certo, mas acaba sendo a única opção.