La forma más simple es obtener la aplicación ApplicationInstance
, y usar su Context
propiedad:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(gracias a Ishmael Smyrnow que notó esto en los comentarios)
Respuesta original:
Puede hacerlo, especialmente si la HttpContextBase
instancia que le han entregado es de tipo HttpContextWrapper
en tiempo de ejecución. El siguiente ejemplo ilustra cómo puede hacer esto. Supone que tiene un método llamado Foo
que acepta el contexto como HttpContextBase
pero luego necesita llamar a un método en un ensamblado de terceros (que puede que no tenga la suerte de modificar) que espera que el contexto se escriba como 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
tiene un método llamado GetService
como resultado del soporte IServiceProvider
. La GetService
anulación de HttpContextWrapper
delegados a la GetService
implementación de la HttpContext
instancia envuelta . La GetService
aplicación de la HttpContext
que permite la consulta de los sospechosos habituales, como HttpApplication
, HttpRequest
, HttpResponse
y así sucesivamente. Sucede que HttpApplication
tiene una propiedad llamada Context y que devuelve una instancia de HttpContext
. Entonces uno llega a la HttpContext
instancia envuelta preguntando HttpContextBase
por HttpApplication
vía GetService
seguido de leer la Context
propiedad de la HttpApplication
instancia devuelta .
A diferencia HttpContextBase
, GetService
no aparece como un miembro público de, HttpContext
pero eso se debe a que HttpContext
implementa la IServiceProvider.GetService
explicidad mientras HttpContextBase
que no lo hace.
Tenga en cuenta que Foo
ya no es comprobable porque se basa en poder desenvolver el subyacente HttpContext
durante la prueba y, en primer lugar, es casi imposible falsificarlo. El punto de esta respuesta, sin embargo, es abordar la pregunta, "¿Cómo obtengo un objeto HttpContext de HttpContextBase?", Literalmente . La técnica ilustrada es útil en aquellas situaciones en las que te encuentras intercalado entre componentes que no necesariamente tienes el lujo de modificar.