Подтвердить что ты не робот

Не удалось обновить cookie в ASP.NET

Я схожу с ума. Я могу написать в файл 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. Что не так?

EDIT:

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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