vista una pasar net mvc entre datos controladores controlador busqueda asp asp.net-mvc httpcontext

una - HttpContext en instancias de controladores son nulas en ASP.net MVC



search asp net core (5)

Puede que esta no sea la manera correcta de usar los controladores, pero noté este problema y no encontré la forma 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 "verdadero" HttpContext que encontraría en System.Web.HttpContext.Current.

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


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

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

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


HttpContext, en 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 por DefaultControllerFactory. Cuando desee crear su propia instancia de controlador, puede usar ExecuteMethod del controlador con su propio ControllerContext. No quieres hacer eso es una aplicación real. Cuando obtenga más experiencia con el marco, encontrará el método apropiado para hacer lo que quiera. Cuando necesite la prueba ControllerContext in Unit, puede usar un marco de burla para simular el ControllerContext o puede simularlo en clase.

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

Cuando sea nuevo en Asp.net mvc, vale la pena el esfuerzo de descargar el código fuente y leer y rastrear la ruta de cómo se procesa una solicitud.


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

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

HttpContext fue nulo para todos menos para la primera solicitud. Me llevó un tiempo rastrear ese.


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


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; } }

Donde esto se agrega a una clase de Controlador de la cual heredan estos Controladores.

No estoy seguro si el HttpContext es nulo es el comportamiento deseado, pero esto lo arreglará mientras tanto para mí.