无法在 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 以便在 后续请求 上可用,但 GetUserSettingsRequest 读取 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 中无法正常工作

更新到 beta8 后无法发布 asp.net 5 应用程序 - 依赖项......无法解决

无法使用 ASP .NET Core 更新 SQL 位列

更新到 ASP.NET Core 2 后无法获取配置部分

在 asp.net core 中插入/更新记录时出错