2012-01-18 21 views
12

Me estoy volviendo loco por esto. Puedo escribir en una cookie y luego leerla nuevamente. Pero en algún momento, quiero actualizar el valor que tiene. Cada vez que obtengo la cookie de nuevo, obtengo el valor inicial, no el actualizado. A continuación se muestra el código que uso para escribir/actualizar y leer de la cookie.No se puede actualizar la cookie en ASP.NET

private static HttpCookie WriteCookie(Guid siteId, string siteName) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if(cookie != null) { 
      cookie.Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }); 
      HttpContext.Current.Response.Cookies.Set(cookie); 
     }else { 
      cookie = new HttpCookie("UserSettings") { Path = "/", Expires = DateTime.Now.AddDays(1), Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }) }; 
      HttpContext.Current.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 

    public static UserSettingsModel GetUserSettings(string username = null) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
     { 
      cookie = ResetUserSettings(); 
     } 
     var userSettings = DecryptObject<UserSettingsModel>(cookie.Value); 
     if (userSettings != null) 
     { 
      var siteId = userSettings.SiteID; 
      var siteName = userSettings.SiteName; 
      return new UserSettingsModel { SiteID = siteId, SiteName = siteName }; 
     } 
     throw new SecurityException("You have no site attached to your user. Contact an administrtor."); 
    } 

GetUserSettings siempre devuelve el valor de la cookie que fue creado inicialmente con. ¿Qué pasa?

EDIT:

intenté llamar WriteCookie directamente de un método en un controlador. La cookie ahora estaba configurada. Usualmente llamé a WriteCookie a través de una solicitud de Ajax. Ahora, ¿realmente tengo que escribir la cookie usando JavaScript, o puedo de alguna manera simplemente hacerlo usando WriteCookie?

Gracias!

+0

¿Revisaste lo que realmente se envía con el violín? Mire la expiración y el camino en particular. – Oded

+0

Estoy usando el navegador Chrome, y utilizando las herramientas integradas de desarrollo, puedo ver que el valor de la cookie nunca se actualiza. Me pregunto por qué – Andreas

+0

Mire los encabezados de solicitud y respuesta para ver qué está pasando. – Oded

Respuesta

17

Trate de esta manera:

var response = HttpContext.Current.Response; 
response.Cookies.Remove("UserSettings"); 
response.Cookies.Add(cookie); 

pero sospecho que el problema real es que está llamando el método y el método WriteCookieGetUserSettings en la misma petición HTTP que no funciona como se podría pensar que lo haría o como es de esperar

El WriteCookie escribe la cookie para Respuesta de modo que está disponible en solicitudes posteriores pero el GetUserSettings lee la cookie de la Solicitud por lo que está recibiendo el valor de la cookie que se estableció inicialmente cuando esta solicitud se inició, que por supuesto es el valor anterior. Entonces, después de llamar al WriteCookie para actualizar el valor de la cookie de configuración del usuario, realice una redirección y solo en la solicitud posterior use el método GetUserSettings.

También en ASP.NET MVC normalmente no desea utilizar el objeto estático HttpContext.Current, pero utilice las abstracciones que este marco le proporciona. Sé que escribió esos dos métodos como estáticos, pero debería haberlos escrito como un método de extensión para el objeto HttpContextBase, por ejemplo. De esta forma, podría haberlos llamado en cualquier lugar donde haya tenido una instancia de esta clase base abstracta que ASP.NET MVC le ofrece en muchos lugares comunes durante la vigencia de una solicitud HTTP.

+0

Intenté eliminar y luego agregar, como sugirió. Eso no funcionó. Se llama a WriteCookie usando una llamada Ajax. Cuando esta llamada retorna, la página se actualiza y se llama a GetUserSettings. Entonces las llamadas están en diferentes solicitudes. No mencione las llamadas Ajax paralizadas y luego vuelva a cargar. Sé que esto debería ser limpiado. – Andreas

+0

La página se actualiza con "window.location.reload();" pero intenté hacer Ctrl + F5 y todavía obtengo el valor anterior. Me doy cuenta de que el otro solo se golpea la primera vez. esta es la forma en que debería funcionar. si hay una cookie, la cookie debe actualizarse. de lo contrario, debería crearse – Andreas

+1

El problema era que estaba llamando a WriteCookie desde una solicitud de Ajax. Reescribí el código, por lo que la cookie ahora se establece a través de JavaScript. Funciona como un encanto ahora. Gracias por apuntar en la dirección correcta – Andreas

Cuestiones relacionadas