Невозможно обновить cookie в ASP.NET - PullRequest
12 голосов
/ 18 января 2012

Я схожу с ума по этому. Я могу написать в печенье, а затем прочитать его снова. Но в какой-то момент я хочу обновить значение, которое оно содержит. Всякий раз, когда я получаю печенье снова, я получаю начальное значение, а не обновленное. Ниже приведен код, который я использую для записи / обновления и чтения файла 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 был изначально создан. Что не так?

EDIT:

Я пытался вызвать WriteCookie напрямую из метода в контроллере. Печенье было установлено. Я обычно звонил WriteCookie через Ajax-запрос. Теперь, действительно ли мне нужно писать куки, используя JavaScript, или я могу как-то просто сделать это, используя WriteCookie?

Спасибо!

1 Ответ

17 голосов
/ 18 января 2012

Попробуй так:

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

Но я подозреваю, что ваша настоящая проблема заключается в том, что вы вызываете метод WriteCookie и метод GetUserSettings в одном и том же HTTP-запросе, который не работает так, как вы думаете или ожидаете.

WriteCookie записывает cookie в Response , чтобы он был доступен для последующих запросов , но GetUserSettings считывает cookie из Request вы получаете значение cookie, которое было изначально установлено при запуске этого запроса, что, конечно, является старым значением. Поэтому после вызова WriteCookie для обновления значения файла cookie пользовательских настроек выполните перенаправление и только при последующем запросе используйте метод GetUserSettings.

Также в ASP.NET MVC вы, как правило, не хотите использовать статический объект HttpContext.Current, а используете абстракции, которые предоставляет вам эта среда. Я знаю, что вы написали эти 2 метода как статические, но вы должны были написать их как метод расширения для объекта HttpContextBase, например. Таким образом, вы могли бы вызывать их в любом месте, где у вас был экземпляр этого абстрактного базового класса, который ASP.NET MVC предоставляет вам во многих общих местах во время жизни HTTP-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...