asp.net-mvc - sesiones - session mvc c# example
HttpContext.Items con ASP.NET MVC (3)
Hice una prueba y TempData sí explota con estado de sesión deshabilitado. Mi único consejo sería no almacenar el objeto en sí mismo en datos temporales sino almacenar los campos simples escritos como se sugirió. Como no está serializando árboles de objetos, no debería tener un gran impacto en el rendimiento al quedarse sin proceso.
Estoy implementando mi propia clase ApplicationContext que usa el patrón singleton. Quiero almacenar mi instancia en HttpContext.Items, ya que está accesible en todas las partes de la solicitud. He estado leyendo sobre el uso de HttpContext con ASP.NET MVC y uno de los principales problemas es que presenta la complejidad de las pruebas. He intentado investigar sobre la capacidad de prueba de HttpContext.Items, pero todo lo que puedo encontrar es material en Session. Una de las únicas cosas que he encontrado está fuera de un capítulo de muestra en el libro Professional ASP.NET 3.5 MVC en Wrox ( enlace pdf aquí ). En la página 15 dice esto:
Algo que no puede usar: HttpContext.Items
Arriba en esta sección, aclaramos y le dijimos que le mentimos: HttpContext no se comparte entre ASP.NET MVC y ASP.NET Web Forms. Como resultado de esto, no puede usar la colección HttpContext.Items para almacenar y recuperar bits de datos.
La razón de esto es porque una vez que se redirige a un Controlador, su HttpHandler se convierte en System.Web.Mvc.MvcHandler, que se crea utilizando HttpContextWrapper, que tendrá su propia definición de HttpContext.Current. Lamentablemente, durante este apretón de manos, elementos como HttpContext.Items no se transfieren.
Lo que se reduce a esto es que los tipos de HttpContext, a pesar de verse y sonar de forma muy similar, no son lo mismo, y no se pueden pasar datos de esta manera.
Ahora, he intentado probar esto, y hasta donde puedo decir, si redirige a otro controlador usando RedirectToAction, HttpContext.Items permanece. Estoy usando el proyecto ASP.NET MVC predeterminado para probar esto. Lo que he hecho es agregar este método a Global.asax.cs:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
Y en HomeController.cs, he cambiado el método del índice a:
public ActionResult Index()
{
return RedirectToAction("About");
}
Y cambió el método Acerca de a:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
Cuando ejecuto la aplicación, la página redirige correctamente a / Home / About y Response. Escribe la cadena correcta "Hello World" establecida en global.asax.cs.
Por lo tanto, me parece que no entiendo lo que significa el libro cuando dicen "cosas como HttpContext.Items no se transfieren" O transfiere esto y está bien usar HttpContext.Items.
Si ustedes recomiendan que evite HttpContext.Items, ¿existe alguna otra forma alternativa de almacenar un objeto en una solicitud por solicitud?
Su pregunta es hacer algunas cosas, pero creo que el elemento # 1 es la respuesta que está buscando.
¿Está bien usar
Context.Items
para el almacenamiento en caché por solicitud? Sí. Si está en proceso, por solicitud, por máquina en la granja de servidores es su criterio, Context.Items le ofrece eso.¿
Context.Items
difícil evaluar los elementosContext.Items
? En cuanto a laContext.Items
esconderíaContext.Items
detrás de una interfaz de algún tipo. De esta forma obtendrá capacidades de pruebas unitarias sin tener que hacer referencia directamente aContext.Items
. De lo contrario, ¿qué necesitas para probar sobreContext.Items
? Que el marco almacenará y recuperará los valores? Mantenga su código ignorante deSystem.Web
y usted será un feliz campista.¿Sobrevivirán los elementos del
Context.Items
RedirectToAction
? No. Tu prueba no es válida. Está configurando "Hola, mundo" en cada solicitud web y su prueba abarca dos solicitudes web. El primero es cuando se llama a la acción Index. El segundo es cuando se llama a la acciónRedirectToAction
(es un HTTP 302). Para que falle, establezca un nuevo valor en la acción Índice y vea si se retiene en la acción Acerca de.
Use el Diccionario TempData, principalmente para almacenar objetos entre las acciones redirigir:
public ActionResult Index()
{
TempData.Add("Test", "Hello world");
return RedirectToAction("About");
}
public ActionResult About()
{
ViewData["Test"] = TempData["Test"];
return View();
}
Luego recupera el valor en tu vista:
<%=ViewData["Test"] %>