100 votos

¿Cómo obtengo un objeto HttpContext de HttpContextBase en ASP.NET MVC 1?

Estoy trabajando con algunos WebForms / herramientas MVC-agnósticos, y necesito para obtener una instancia de HttpContext da una referencia a un HttpContextBase objeto. No puedo usar HttpContext.Current porque necesito que esto funcione de forma asíncrona, así ( HttpContext.Current retornos null durante una solicitud asincrónica). Soy consciente de HttpContextWrapper , pero va por el camino equivocado.

174voto

Atif Aziz Puntos 16967

La forma más sencilla es obtener la solicitud, ApplicationInstance, y en uso de sus Context de la propiedad:

// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;

(gracias a Ismael Smyrnow que observó esto en los comentarios)

Respuesta Original:

Usted puede, especialmente si el HttpContextBase instancia que han sido entregados es de tipo HttpContextWrapper en tiempo de ejecución. El siguiente ejemplo ilustra cómo se puede hacer esto. Se supone que tienen un método llamado Foo que acepta contexto como HttpContextBase pero luego, se debe llamar a un método en una tercera parte de la asamblea (que puede que no tenga la buena fortuna a modificar) que está esperando el contexto para ser escrito 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 de apoyar IServiceProvider. La GetService invalidar HttpContextWrapper a los delegados a las GetService de ejecución de la envuelta HttpContext de instancia. La GetService de ejecución de HttpContext permite la consulta de sospechosos habituales como HttpApplication, HttpRequest, HttpResponse y así sucesivamente. Sucede que HttpApplication tiene una propiedad denominada Contexto y que devuelve una instancia de HttpContext. Así que uno se pone en el envueltos HttpContext de instancia pidiendo HttpContextBase para HttpApplication través GetService seguido por la lectura de la Context de la propiedad de la devueltos HttpApplication de instancia.

A diferencia HttpContextBase, GetService no aparece como un miembro del público, de HttpContext pero eso es porque HttpContext implementa IServiceProvider.GetService claramente, mientras HttpContextBase no.

Tenga en cuenta que Foo ya no es comprobable, ya que se basa en ser capaz de desenvolver el subyacente HttpContext durante la prueba y que es imposible falso/auxiliar en el primer lugar. El punto de esta respuesta, sin embargo, es la dirección de la pregunta, "¿Cómo puedo obtener un objeto HttpContext de HttpContextBase?", literalmente. La técnica ilustrada es útil en aquellas situaciones en las que usted se encuentra intercalada entre los componentes que necesariamente no tiene el lujo de modificar.

13voto

Marc Chouteau Puntos 113

Usted puede,

 var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
 

11voto

Mark Seemann Puntos 102767

No puedes.

El propósito de HttpContextBase es abstraernos de la dependencia de la clase HttpContext concreta. Mientras que puede contener un HttpContext concreto (como es el caso de httpContextWrapper), otras implementaciones pueden tener absolutamente nada que ver con HttpContext.

Tu mejor opción es definir un Abstract Factory personalizado que puede conseguir un HttpContextBase para usted, ya que siempre puedes envolver un HttpContext concreto en un HttpContextWrapper.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: