2012-05-31 175 views
2

我通常不會使用Cookies,但我想查看這一節經文中我通常使用的會話變量。Cookie不能快速設置

如果我設置了一個Cookie,然後立即嘗試從它讀取,我沒有得到我剛剛設置的值。

但是,如果我刷新頁面或關閉瀏覽器並將其打開,Cookie似乎已設置。

我在Chrome中調試這個。這會有什麼不同嗎?

public const string COOKIE = "CompanyCookie1"; 
private const int TIMEOUT = 10; 

private string Cookie1 { 
    get { 
    HttpCookie cookie = Request.Cookies[COOKIE]; 
    if (cookie != null) { 
     TimeSpan span = (cookie.Expires - DateTime.Now); 
     if (span.Minutes < TIMEOUT) { 
     string value = cookie.Value; 
     if (!String.IsNullOrEmpty(value)) { 
      string[] split = value.Split('='); 
      return split[split.Length - 1]; 
     } 
     return cookie.Value; 
     } 
    } 
    return null; 
    } 
    set { 
    HttpCookie cookie = new HttpCookie(COOKIE); 
    cookie[COOKIE] = value; 
    int minutes = String.IsNullOrEmpty(value) ? -1 : TIMEOUT; 
    cookie.Expires = DateTime.Now.AddMinutes(minutes); 
    Response.Cookies.Add(cookie); 
    } 
} 

下面是我如何使用它:

public Employee ActiveEmployee { 
    get { 
    string num = Request.QueryString["num"]; 
    string empNum = String.IsNullOrEmpty(num) ? Cookie1 : num; 
    return GetActiveEmployee(empNum); 
    } 
    set { 
    Cookie1 = (value != null) ? value.Badge : null; 
    } 
} 

這是我特意打電話吧,在那裏Request.QueryString["num"]回報NULL使Cookie1正在讀取:

ActiveEmployee = new Employee() { Badge = "000000" }; 
Console.WriteLine(ActiveEmployee.Badge); // ActiveEmployee is NULL 

...但從Cookie1讀取也返回null。

是否需要調用Commit()這樣的命令以便cookie值立即可用?

回答

2

要添加到其他的答案,你可以通過在情況下,一個私有變量緩存值繞過這個問題的cookie尚未更新:

private string _cookie1Value = null; 
private string Cookie1 { 
    get { 
    if (_cookie1Value == null) 
    { 
     // insert current code 
     _cookie1Value = cookie.Value; 
    } 
    return _cookie1Value; 
    } 
    set { 
    // insert current code 
    _cookie1Value = value; 
    } 
} 
+0

+1,應該是'else {插入當前代碼 _cookie1Value = cookie.Value; return _cookie1Value; } –

+0

另外,可能想要在setter中的Response.Cookies中設置cookie。 –

+1

@ChrisShain:謝謝,我重新整理並簡化了getter。關於你的第二條評論,這就是在設置器中插入當前代碼的原因。 – mellamokb

5

當您設置在響應一個cookie它不會神奇地運入要求 Cookies集合。它在響應中,你可以自由地在那裏檢查它,但它不會出現在請求對象中,直到它實際上在下一個請求中從瀏覽器發送出去。

6

餅乾不像Session-有兩個 Cookie集合,而不是一個。

Request.Cookies != Response.Cookies。前者是當瀏覽器請求頁面時從瀏覽器發送的一組cookie,後者是您發送內容的內容。這暴露了Cookie RFC的本質,與Session不同,它是純粹的Microsoft構造。

+0

你們這些人很快就嚇壞了!那麼,我應該/還可以將這個cookie寫入Request.Cookies集合嗎? (僅供參考:我曾嘗試過,但在我刷新頁面之前它仍未顯示出我的價值) – jp2code

+0

您不應該嘗試將其寫入請求。Cookies--用於讀取從瀏覽器發送的值。從請求中讀取,寫入回覆。 –

1

就乾脆把它;作爲響應而設置的cookie只能用於下一個htpp請求(來自瀏覽器的下一個獲取或發佈操作)。

詳細說明:當在HttpResponse中設置cookie值時,只有當響應到達客戶端(意味着瀏覽器將從Http Response頭中讀取cookie值並保存它),它纔會被保存/存儲。所以,從技術上來說,只有從今以後的要求才可用。例如,當用戶在瀏覽器中點擊一個鏈接或一個在此週期後進行服務器調用的按鈕時。

希望這給你一些想法,我建議你閱讀什麼是cookies和ASP.NET在使用它之前包裝它。