2011-02-16 75 views
2

我有一些讀取和寫入cookie值的asp.net頁面。在頁面的生命週期中,它可能會更新cookie值,然後需要在代碼中再讀一遍。我發現,在頁面刷新之前,它不會獲取cookie的最新值。有沒有解決的辦法?以下是我用來設置和獲取值的代碼。cookie不會更新,直到頁面刷新...如何避免這種情況?

public static string GetValue(SessionKey sessionKey) 
     { 
      HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix]; 
      if (cookie == null) 
       return string.Empty; 

      return cookie[sessionKey.SessionKeyName] ?? string.Empty; 
     } 

     public static void SetValue(SessionKey sessionKey, string sessionValue) 
     { 
      HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix]; 
      if (cookie == null) 
       cookie = new HttpCookie(cookiePrefix); 

      cookie.Values[sessionKey.SessionKeyName] = sessionValue; 
      cookie.Expires = DateTime.Now.AddHours(1); 
      HttpContext.Current.Response.Cookies.Set(cookie); 
     } 

回答

1

開始使用會話來存儲您的信息,即使它只是暫時的。

Cookie在頁面呈現前依賴於發送給瀏覽器的標題。如果您已經將信息發送給客戶端,然後繼續設置cookie,則會看到您描述的這種「頁面刷新延遲」。

如果必須具有此值,請在設置Cookie和刷新頁面之間使用會話變量。但是,即便如此,我還是建議在處理步驟中儘量避免設置Cookie,並儘可能早地設置它。

+1

這就是我們試圖解決的全部問題。我們正在擁有超過400個網站的網絡農場。每個站點的id在服務器到服務器之間並不相同,因此基於數據庫的會話不起作用,當然,在Web場中,inproc會話不起作用。所以我們不能使用會話。 – 2011-02-16 14:56:07

4

你失蹤的是當你用SetValue更新cookie時,你正在寫入Response.Cookies集合。

當您調用GetValue時,您正在讀取Request.Cookies集合。

您需要以訪問當前信息的方式存儲瞬態信息,而不僅僅是直接請求cookie。要做到這一點

一個潛在方法是作家一個包裝類:具有粗糙的僞代碼將類似於

public CookieContainer(HttpContext context) 
{  
    _bobValue = context.Request.Cookies["bob"];  
} 

public Value 
{  
    get { return _bobValue; } 
    set { 
      _bobValue = value; 
      _context.Response.Cookies.Add(new Cookie("bob", value) { Expires = ? }); 
     }  
} 

我跑進需要就在這個星期做類似的代碼。 cookie處理模型非常奇怪。

相關問題