2012-01-18 15 views
12

Sto andando fuori di testa per questo. Posso scrivere su un cookie e poi leggerlo di nuovo. Ma ad un certo punto, voglio aggiornare il valore che detiene. Ogni volta che prendo di nuovo il cookie, ottengo il valore iniziale, non quello aggiornato. Di seguito è riportato il codice che utilizzo per scrivere/aggiornare e leggere il cookie.Impossibile aggiornare i cookie in 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 restituisce sempre il valore che il cookie è stato inizialmente creato con. Cosa c'è che non va?

EDIT:

Ho provato a chiamare WriteCookie direttamente da un metodo in un controller. Il cookie era ora impostato. Di solito chiamavo WriteCookie tramite una richiesta Ajax. Ora, devo davvero scrivere il cookie usando JavaScript, o posso in qualche modo farlo solo usando WriteCookie?

Grazie!

+0

Hai controllato cosa viene effettivamente inviato usando il violinista? Guarda l'espirazione e il percorso in particolare. – Oded

+0

Sto utilizzando il browser Chrome e, utilizzando gli strumenti di sviluppo integrati, posso vedere che il valore del cookie non viene mai aggiornato. Mi chiedo perché – Andreas

+0

Guarda le intestazioni di richiesta e risposta per vedere cosa sta succedendo. – Oded

risposta

17

Prova in questo modo:

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

ma ho il sospetto che il vero problema è che si sta chiamando il metodo e il metodo WriteCookieGetUserSettings nella stessa richiesta HTTP che non funziona come si potrebbe pensare che sarebbe o come potresti aspettarti.

Il WriteCookie scrive il cookie Response in modo che sia accessibile richieste successive ma il GetUserSettings legge il cookie dal Richiesta così si stanno ottenendo il valore del cookie che è stato inizialmente impostato quando questa richiesta è stato avviato che naturalmente è il vecchio valore. Quindi, dopo aver chiamato il WriteCookie per aggiornare il valore del cookie delle impostazioni utente, eseguire un reindirizzamento e solo sulla richiesta successiva utilizzare il metodo GetUserSettings.

Anche in ASP.NET MVC in genere non si desidera utilizzare l'oggetto statico HttpContext.Current ma utilizzare le astrazioni fornite da questo framework. So che hai scritto quei due metodi come statici ma dovresti averli scritti come un metodo di estensione dell'oggetto HttpContextBase, ad esempio. In questo modo avresti potuto chiamarli ovunque dovessi avere un'istanza di questa classe base astratta che ASP.NET MVC ti fornisce in molti luoghi comuni durante la vita di una richiesta HTTP.

+0

. Non ha funzionato. WriteCookie viene chiamato utilizzando una chiamata Ajax. Al termine di questa chiamata, la pagina viene aggiornata e viene chiamato GetUserSettings. Quindi le chiamate sono in diverse richieste. Non menzionare le chiamate Ajax azzoppate e quindi ricaricare. So che questo dovrebbe essere pulito. – Andreas

+0

La pagina viene aggiornata utilizzando "window.location.reload();" ma ho provato a fare un Ctrl + F5 e ho ancora il vecchio valore. Mi rendo conto che il resto viene colpito solo la prima volta. questo è il modo in cui dovrebbe funzionare. se c'è un cookie, il cookie deve essere aggiornato. altrimenti dovrebbe essere creato – Andreas

+1

Il problema era che stavo chiamando WriteCookie da una richiesta Ajax. Ho riscritto il codice, quindi il cookie ora è impostato tramite JavaScript. Funziona come un fascino ora. Grazie per aver indicato nella giusta direzione – Andreas

Problemi correlati