[英]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.