我要为这事发疯了。我可以写信给饼干,然后再读一遍。但在某个时候,我想更新它的值。每当我再次得到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。曲奇现在被设定了。我通常通过ajax请求调用writecookie。现在,我真的需要用JavaScript编写Cookie,还是我可以用RealeCookie做它呢?
谢谢!

最佳答案

这样试试:

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

但我怀疑您的实际问题是,您在同一个http请求中调用了WriteCookie方法和GetUserSettings方法,但这并不像您想象的那样,也不像您期望的那样工作。
WriteCookie将cookie写入响应,以便在后续请求中可用,但GetUserSettings从请求中读取cookie,从而获得初始请求时所设置的cookie的值,当然这是旧值。因此,在调用WriteCookie更新用户设置cookie的值之后,执行重定向,并且仅在随后的请求中使用GetUserSettings方法。
同样在asp.net mvc中,您通常不想使用staticHttpContext.Current对象,而是使用此框架提供给您的抽象。我知道您将这两个方法编写为静态的,但是您应该将它们编写为HttpContextBase对象的扩展方法。这样,您就可以在任何地方调用它们,在那里您有一个抽象基类的实例,在http请求的生命周期中,asp.net mvc在许多常见的地方为您提供了这个实例。

07-24 21:30