2014-09-06 92 views
6

我可以編寫和讀取cookie,但我無法更改現有cookie的值,它始終具有第一個設置值。我發現如何實施,但沒有人工作的幾種方法。這裏是我的代碼:無法在asp.net中更新cookie mvc

private void AddPost(string key) 
    { 
     var context = System.Web.HttpContext.Current; 
     var request = context.Request; 
     var response = context.Response; 

     var cookie = request.Cookies[Constants.PostsViewing]; 

     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
     { 
      response.Cookies.Add(new HttpCookie(Constants.PostsViewing, key) 
      { 
       Expires = DateTime.Now.AddDays(365) 
      }); 
     } 
     else 
     { 
      if (cookie.Value.Split(';').Contains(key)) 
      { 
       return; 
      } 

      var v = cookie.Value + ";" + key; 

      cookie.Value = v; 
      cookie.Expires = DateTime.Now.AddDays(365); 
      response.Cookies.Add(cookie); 

      // this way also doesn't work 
      //cookie.Value = v; 
      //response.AppendCookie(cookie); 

      // and this 
      //response.Cookies[Constants.PostsViewing].Value = v; 
      //response.Cookies[Constants.PostsViewing].Expires = DateTime.Now.AddDays(365); 
     } 

    } 

根據msdn cookie文件應owerwritten。

每個cookie都必須具有唯一的名稱,以便稍後在從瀏覽器中讀取時可以識別它。因爲cookie是按名稱存儲的,所以命名兩個cookie相同會導致覆蓋。

你有什麼想法如何解決它?

+0

我有完全相同的問題。完全困惑。 – 2014-09-09 18:20:58

回答

10

我只是碰到了這個確切的情況有相似的代碼塊:

public ActionResult Index(int requestValue) 
{ 
    var name = "testCookie"; 
    var oldVal = Request.Cookies[name] != null ? Request.Cookies[name].Value : null; 
    var val = (!String.IsNullOrWhiteSpace(oldVal) ? oldVal + ";" : null) + requestValue.ToString(); 

    var cookie = new HttpCookie(name, val) 
    { 
     HttpOnly = false, 
     Secure = false, 
     Expires = DateTime.Now.AddHours(1) 
    }; 

    HttpContext.Response.Cookies.Set(cookie); 

    return Content("Cookie set."); 
} 

第一次代碼將運行,該cookie會平安無事地設置。但任何後續運行永遠不會更新它(值或到期)。

原來,分號是cookie值中的一個非法字符,並試圖用它來分隔您的值會導致cookie值被截斷。如果我們將分號更改爲另一個字符,如管道(|),則一切正常。

考慮爲cookie的值發送的報頭(提琴手提供):

響應發送61個字節的Cookie的數據:

的Set-Cookie:testCookie = 2; 1; expires =星期二,09-09-19 19:23:43 GMT; path =/

正如我們所看到的,分號用於分隔cookie定義的各個部分。 因此,如果您想在Cookie值本身中使用分號,則必須對其進行編碼以免被誤解。這個答案給出了更詳細的實際規格:https://stackoverflow.com/a/1969339/143327

+0

這是作品。非常感謝你的回答。 – mykhailovskyi 2014-09-10 11:18:43

1

您不能直接修改cookie。相反,你正在創建一個新的cookie來覆蓋舊的cookie。 http://msdn.microsoft.com/en-us/library/vstudio/ms178194(v=vs.100).aspx

嘗試

var v = cookie.Value + ";" + key; 

Response.Cookies[Constants.PostsViewing].Value = v; 
Response.Cookies[Constants.PostsViewing].Expires = DateTime.Now.AddDays(365); 

這應該改變客戶端的響應,而不是服務器的請求。

爲了使用Response.AppendCookie,您首先必須從Cookies集合中獲取HttpCookie。

+0

它不起作用。正如我在我的問題中寫的,我已經嘗試過了。 – mykhailovskyi 2014-09-06 18:21:49

+1

該解決方案對於該問題無效。 – 2014-09-09 21:09:02

4

您不能以明文形式使用分號作爲分隔符。

根據古老的Netscape cookie_spec:

此字符串是不包括分號,逗號和空格字符序列。