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.
context.ApplicationInstance.Context
?Http*Base
variaciones devueltas porHttpContextBase
. : P Actualizaré la respuesta.Usted puede,
fuente
No puedes
El propósito de
HttpContextBase
es abstraer la dependencia de laHttpContext
clase concreta . Si bien puede contener un contenido concretoHttpContext
(como es el casohttpContextWrapper
) , otras implementaciones pueden no tener absolutamente nada que verHttpContext
.Su mejor opción es definir una Fábrica de abstractos personalizada que pueda obtener una
HttpContextBase
para usted, ya que siempre puede envolver un concretoHttpContext
en unaHttpContextWrapper
.fuente
IHttpHandler
implementaciones, terminas teniendo que poner un número de abstracciones en (Contenedores de respuesta) solo para tus pruebas unitarias, lo que no se siente bien pero termina siendo la única opción.