[英]Unable to update cookies in asp.net mvc
我可以寫和讀cookie但我不能改變現有cookie的值,它總是有第一個設定值。 我發現幾乎沒有辦法實現它,但沒有人工作。 這是我的代碼:
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會導致cookie被覆蓋。
你知道怎么解決它嗎?
我剛剛使用類似的代碼塊遇到了這個確切的場景:
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值發送的標頭(由Fiddler提供):
響應發送了61個字節的Cookie數據:
Set-Cookie:testCookie = 2; 1; expires = Tue,09-Sep-2014 19:23:43 GMT; 路徑= /
我們可以看到,分號用於分隔cookie定義的各個部分。 因此,如果要在cookie值本身中使用分號,則必須對其進行編碼,以免誤解。 這個答案給出了更詳細的實際規范: https : //stackoverflow.com/a/1969339/143327 。
您不能以明文形式使用分號作為分隔符。
根據古老的Netscape cookie_spec:
此字符串是一系列字符,不包括分號,逗號和空格。
您無法直接修改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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.