Pregunta

Puede que esta no sea la forma correcta de usar los controladores, pero me di cuenta de este problema y no había encontrado la manera de corregirlo.

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

Me he dado cuenta de que HttpContext en un controlador no es el " real " HttpContext que encontrarías en System.Web.HttpContext.Current.

¿Hay alguna forma de rellenar manualmente HttpContextBase en un controlador? ¿O una mejor manera de crear una instancia de un controlador?

¿Fue útil?

Solución

Los controladores no están diseñados para crearse manualmente como usted lo está haciendo. Parece que lo que realmente deberías estar haciendo es poner la lógica reutilizable que tienes en una clase auxiliar.

Otros consejos

Por ahora voy a hacer lo siguiente. Esto parece ser una solución aceptable ...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

Cuando se agrega esto a una clase de Controlador, estos Controladores están heredando.

No estoy seguro de que el HttpContext sea nulo sea el comportamiento deseado, pero esto lo solucionará mientras tanto para mí.

El HttpContext, en el ControllerContext es nulo porque no está configurado cuando se crea el controlador. El contructor del controlador no asigna esta propiedad, por lo que será nulo. Normalmente, HttpContext se establece en HttpContext de la clase ControllerBuilder. Los controladores son creados por la clase ControllerBuilder, seguido de DefaultControllerFactory. Cuando desee crear su propia instancia de un controlador, puede usar el Método de Ejecución del controlador con su propio ControllerContext. No quieres hacer eso es una aplicación real. Cuando tenga más experiencia con el marco, encontrará el método apropiado para hacer lo que quiera. Cuando necesite ControllerContext en la prueba de unidades, puede usar un marco de simulacros para burlarse de ControllerContext o puede hacer una simulación de clase.

Puede encontrar un modelo del flujo de solicitudes en asp.net mvc en este blog .

Cuando eres nuevo en Asp.net mvc, vale la pena el esfuerzo de descargar el código fuente y leer un rastro de la ruta en la que se procesa una solicitud.

¿Es que quieres usar alguna funcionalidad del controlador? ¿O hacer que el controlador realice una acción?

Si es el primero, tal vez sea un código que debería dividirse en otra clase. Si es lo último, puedes hacer esto simplemente para que el controlador realice una acción específica:


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

¿Está utilizando una fábrica de controladores? Si es así, ¿cómo estás registrando componentes?

Me encontré con este problema donde inadvertidamente había agregado una dependencia basada en HttpContext como Singleton, en lugar de Transient en Windsor.

HttpContext fue nulo para todos menos la primera solicitud. Me tomó un tiempo rastrear eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top