无法在 ASP.NET 中更新 cookie
Posted
技术标签:
【中文标题】无法在 ASP.NET 中更新 cookie【英文标题】:Unable to update cookie in ASP.NET 【发布时间】:2012-02-13 01:36:07 【问题描述】:我要疯了。我可以写一个 cookie,然后再读一遍。但在某些时候,我想更新它所持有的价值。每当我再次获得 cookie 时,我都会获得初始值,而不是更新后的值。下面是我用于写入/更新和读取 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.");
GetUserSettings
始终返回最初创建 cookie 时使用的值。怎么了?
编辑:
我尝试直接从控制器中的方法调用 WriteCookie。 cookie 现在已经设置好了。我通常通过 Ajax 请求调用 WriteCookie。现在,我真的必须使用 javascript 编写 cookie,还是我可以使用 WriteCookie 以某种方式完成它?
谢谢!
【问题讨论】:
您是否检查了使用 fiddler 实际发送的内容?特别注意到期和路径。 我使用的是 Chrome 浏览器,并且使用集成的开发者工具,我可以看到 cookie 值永远不会更新。我想知道为什么 查看请求和响应标头以了解发生了什么。 据我所知,响应标头中没有 cookie。我可以在请求标头中看到初始 cookie 值 【参考方案1】:试试这样:
var response = HttpContext.Current.Response;
response.Cookies.Remove("UserSettings");
response.Cookies.Add(cookie);
但我怀疑您的实际问题是您在同一个 HTTP 请求中调用 WriteCookie
方法和 GetUserSettings
方法,这并不像您想象的那样或您期望的那样工作。
WriteCookie
将 cookie 写入 Response 以便在 后续请求 上可用,但 GetUserSettings
从 Request 读取 cookie strong> 因此,您将获得发起此请求时最初设置的 cookie 的值,这当然是旧值。因此,在调用WriteCookie
更新用户设置cookie 的值后,执行重定向,并且仅在后续请求上使用GetUserSettings
方法。
同样在 ASP.NET MVC 中,您通常不想使用静态 HttpContext.Current
对象,而是使用该框架提供给您的抽象。我知道您将这 2 个方法编写为静态的,但您应该将它们编写为例如 HttpContextBase
对象的扩展方法。这样,您可以在任何拥有此抽象基类实例的任何地方调用它们,ASP.NET MVC 在 HTTP 请求的生命周期内的许多常见位置为您提供该实例。
【讨论】:
按照您的建议,我尝试删除然后添加。那没有用。使用 Ajax 调用调用 WriteCookie。当此调用返回时,将刷新页面并调用 GetUserSettings。所以调用是在不同的请求中。不要提及残废的 Ajax 调用然后重新加载。我知道这应该清理干净。 使用“window.location.reload();”刷新页面但我尝试做一个 Ctrl + F5 ,我仍然得到旧值。我意识到 else 只是第一次被击中。这是它应该工作的方式。如果有 cookie,则应该更新 cookie。否则它应该被创建 问题是我从 Ajax 请求中调用 WriteCookie。我重写了代码,所以现在 cookie 是通过 JavaScript 设置的。现在就像一个魅力。感谢您指出正确的方向 您好安德烈亚斯,感谢您的评论。是的,它的ajax调用。我真的是在敲我的头。我已经重写并删除了 ajax 调用,现在效果很好。 您好安德烈亚斯,感谢您的评论。是的,它的ajax调用。我真的是在敲我的头。我已经重写并删除了对 var urlSetTheam = '@Url.Action("SetTheam")' + '?sTheamSelected=' + selectedValueText; 的 ajax 调用现在工作得很好。以上是关于无法在 ASP.NET 中更新 cookie的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET 新手 - 无法从 SQL 数据库更新 DataGrid
向导控件中的 Gridview 自定义分页在 asp.net 中无法正常工作