2014-09-06 88 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:

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