2009-06-30 14 views
5

Tengo un problema donde se está perdiendo una cookie que estoy configurando directamente después de llamar a RedirectToAction(). ¿Hay algo detrás de escena que invalide la solicitud actual y cree una nueva que haga que la cookie se pierda antes de que se haya conservado en el disco?Cookie no se conserva en MVC

Entiendo que si desea que los datos estén disponibles después de la redirección, debe usar TempData, pero ¿es lo mismo para las cookies? Si es así, ¿no parece feo tener que almacenar el valor de la cookie en TempData y luego escribir la cookie más tarde?

Actualización:

me he dado cuenta de que la cookie se pierde al final de la solicitud, no importa si llamo RedirectToAction(). Así que ahora la pregunta es ¿por qué la cookie persiste y no se aceptan dos solicitudes? (Puedo actualizar el código siguiente para mostrar lo que estoy haciendo ahora)

public ActionResult DoSomething() 
{ 
    Response.Cookies["SomeCookie"].Value = "Jarified"; 
    Response.Cookies["SomeCookie"].Expires = DateTime.UtcNow.AddDays(3); 

    return View("SomeView"); 

} 

actualización

que crea un nuevo proyecto MVC usando la plantilla por defecto. Modifiqué la acción HomeController/Index para tener el código a continuación. La primera vez que presiono la vista "Cookie Not Found" se imprime como se esperaba. Sin embargo, cada vez posterior se imprime el mismo mensaje. Si elimino la línea que establece la fecha de caducidad, todo funciona bien. Supongo que la verdadera pregunta aquí es por qué la persistencia de la cookie hace que el navegador la descarte? ¿Hay algún truco para hacer que las cookies persistan en MVC?

public ActionResult Index() 
    { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     if (cookie == null) 
     { 
      ViewData["Message"] = "Cookie Not Found"; 
      Response.Cookies["temp"].Value = "Welcome to ASP.NET MVC!"; 
      Response.Cookies["temp"].Expires = DateTime.UtcNow; 
     } 
     else 
     { 
      ViewData["Message"] = cookie.Value; 
     } 
     return View(); 
    } 

Respuesta

5

La razón de que

Response.Cookies["temp"].Expires = DateTime.UtcNow; 

no funciona es que establece una cookie con un expira en el pasado (al menos para mí).

funciona cuando cambio a

Response.Cookies["temp"].Expires = DateTime.UtcNow.AddDays(3); 

creando una cookie expira propiedad al pasado, se eliminará la cookie.

Este código funciona para mí:

public ActionResult Index() { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     if (cookie == null) { 
      ViewData["Message"] = "Cookie Not Found"; 
      Response.Cookies["temp"].Value = "This is a cookie: Welcome to ASP.NET MVC!"; 
      Response.Cookies["temp"].Expires = DateTime.UtcNow.AddDays(3); 
     } else { 
      return RedirectToAction("Something"); 
     } 
     return View(); 
    } 

    public ActionResult Something() { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     ViewData["Message"] = cookie.Value; 
     return View(); 
    } 
+0

Anoche me di cuenta de que si he cambiado de la segunda muestra a DateTime.UtcNow .AddDays (3); estaba funcionando. Lo que todavía no tengo claro es por qué mi primer ejemplo no funcionará para mí. Creo que mi problema original fue el valor que estaba almacenando, no está "Jarified", pero es una cadena mucho más larga. Me pregunto si la fecha de caducidad está causando que la longitud supere los 4K. ¡Gracias por la respuesta! – Joe

0

Aquí hay un chiste para el establecimiento de una fecha de caducidad de cookies y

Response.Cookies.Add(new HttpCookie("myCookie", "cookie value") 
    { Expires = DateTime.Now.AddDays(1)}); 
Cuestiones relacionadas