La forma más simple es obtener la aplicación ApplicationInstance, y usar su Contextpropiedad:
// 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 HttpContextBaseinstancia que le han entregado es de tipo HttpContextWrapperen tiempo de ejecución. El siguiente ejemplo ilustra cómo puede hacer esto. Supone que tiene un método llamado Fooque acepta el contexto como HttpContextBasepero 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) { /* ... */ }
HttpContextBasetiene un método llamado GetServicecomo resultado del soporte IServiceProvider. La GetServiceanulación de HttpContextWrapperdelegados a la GetServiceimplementación de la HttpContextinstancia envuelta . La GetServiceaplicación de la HttpContextque permite la consulta de los sospechosos habituales, como HttpApplication, HttpRequest, HttpResponsey así sucesivamente. Sucede que HttpApplicationtiene una propiedad llamada Context y que devuelve una instancia de HttpContext. Entonces uno llega a la HttpContextinstancia envuelta preguntando HttpContextBasepor HttpApplicationvía GetServiceseguido de leer la Contextpropiedad de la HttpApplicationinstancia devuelta .
A diferencia HttpContextBase, GetServiceno aparece como un miembro público de, HttpContextpero eso se debe a que HttpContextimplementa la IServiceProvider.GetServiceexplicidad mientras HttpContextBaseque no lo hace.
Tenga en cuenta que Fooya no es comprobable porque se basa en poder desenvolver el subyacente HttpContextdurante 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*Basevariaciones devueltas porHttpContextBase. : P Actualizaré la respuesta.Usted puede,
fuente
No puedes
El propósito de
HttpContextBasees abstraer la dependencia de laHttpContextclase 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
HttpContextBasepara usted, ya que siempre puede envolver un concretoHttpContexten unaHttpContextWrapper.fuente
IHttpHandlerimplementaciones, 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.