2012-01-18 24 views
12

我对此很感兴趣。我可以写一个cookie,然后再读一遍。但是在某些时候,我想更新它的价值。每当我再次获取cookie时,我都会得到初始值,而不是更新后的值。以下是我用于写入/更新和读取cookie的代码。无法更新ASP.NET中的Cookie

private static HttpCookie WriteCookie(Guid siteId, string siteName) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if(cookie != null) { 
      cookie.Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }); 
      HttpContext.Current.Response.Cookies.Set(cookie); 
     }else { 
      cookie = new HttpCookie("UserSettings") { Path = "/", Expires = DateTime.Now.AddDays(1), Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }) }; 
      HttpContext.Current.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 

    public static UserSettingsModel GetUserSettings(string username = null) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
     { 
      cookie = ResetUserSettings(); 
     } 
     var userSettings = DecryptObject<UserSettingsModel>(cookie.Value); 
     if (userSettings != null) 
     { 
      var siteId = userSettings.SiteID; 
      var siteName = userSettings.SiteName; 
      return new UserSettingsModel { SiteID = siteId, SiteName = siteName }; 
     } 
     throw new SecurityException("You have no site attached to your user. Contact an administrtor."); 
    } 

​​总是返回cookie最初创建的值。怎么了?

编辑:

我试图直接从一个控制器的方法调用WriteCookie。该cookie现在已设置。我通常通过Ajax请求调用WriteCookie。现在,我是否真的必须使用JavaScript编写cookie,或者我可以用WriteCookie来完成它?

谢谢!

+0

你检查什么是使用招实际发送?特别注意过期和路径。 – Oded

+0

我正在使用Chrome浏览器,并使用集成的开发人员工具,我可以看到cookie值永远不会更新。我不知道为什么 – Andreas

+0

看看请求和响应标题,看看发生了什么。 – Oded

回答

17

尝试这样的:

var response = HttpContext.Current.Response; 
response.Cookies.Remove("UserSettings"); 
response.Cookies.Add(cookie); 

但我怀疑你的实际问题是,您所呼叫的WriteCookie方法,并在相同的HTTP请求​​方法,你可能会认为这将不工作或者如你所期望的那样。

WriteCookie饼干写入响应,使其可在后续请求但​​读取来自请求所以你得到的cookie的值,最初设置时,该请求的饼干当然这是旧的价值。因此,在调用WriteCookie来更新用户设置cookie的值之后,请执行重定向,并且仅在随后的请求中使用​​方法。

此外,在ASP.NET MVC你通常不希望使用静态HttpContext.Current对象,但使用的抽象,该框架提供给你。我知道您将这两种方法编写为静态方法,但您应将其作为扩展方法写入HttpContextBase对象。通过这种方式,您可以在任何有这个抽象基类的实例的地方调用它们,在HTTP请求的生命周期内,ASP.NET MVC可以在许多常见场所为您提供这种实例。

+0

我尝试删除然后按照您的建议添加。这没有用。 WriteCookie使用Ajax调用进行调用。当这个调用返回时,页面刷新并调用GetUserSettings。所以这些电话是在不同的请求。不要提及瘫痪的Ajax调用,然后重新加载。我知道这应该清理。 – Andreas

+0

使用“window.location.reload();”刷新页面但我试着做一个Ctrl + F5,我仍然得到旧值。我意识到其他的只是第一次。这是它应该工作的方式。如果有cookie,则应该更新cookie。否则应该创建 – Andreas

+1

问题是我从Ajax请求调用WriteCookie。我重写了代码,现在通过JavaScript设置cookie。现在就像魅力一样。感谢您指出正确的方向 – Andreas