Кэш-память показывает старые значения на IIS7, а не на сервере отладки - PullRequest
2 голосов
/ 31 января 2012

У меня довольно стандартное приложение MVC3. Я пытаюсь сохранить в кеше некоторые данные, относящиеся ко всему приложению (а не ко всем пользователям) (в данном случае, Theme объект / имя). При отладке (на сервере разработки, который интегрируется с Visual Studio), если я вызываю SwitchTheme, я сразу вижу новую тему. На IIS7, любая тема была кэширована, остается в кэше; не обновляется до новой темы.

Редактировать: Некоторые коды:

    public static Theme CurrentTheme { get {
        Theme currentTheme = HttpContext.Current.Cache[CURRENT_THEME] as Theme;

        if (currentTheme == null)
        {
            string themeName = DEFAULT_THEME;
            try
            {
                WebsiteSetting ws = WebsiteSetting.First(w => w.Key == WebsiteSetting.CURRENT_THEME);

                if (ws != null && !string.IsNullOrEmpty(ws.Value))
                {
                    themeName = ws.Value;
                }
            }
            catch (Exception e)
            {
                // DB not inited, or we're installing, or something broke.
                // Don't panic, just use the default.
            }

            // Sets HttpContext.Current.Cache[CURRENT_THEME] = new themeName)
            Theme.SwitchTo(themeName);
            currentTheme = HttpContext.Current.Cache[CURRENT_THEME] as Theme;

        }

        return currentTheme;
    } }

public static void SwitchTo(string name)
    {
        HttpContext.Current.Cache.Insert(CURRENT_THEME, new Theme(name), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));

        // Persist change to the DB.
        // But don't do this if we didn't install the application yet.
        try
        {
            WebsiteSetting themeSetting = WebsiteSetting.First(w => w.Key == WebsiteSetting.CURRENT_THEME);
            if (themeSetting != null)
            {
                themeSetting.Value = name;
                themeSetting.Save();
            }
            // No "else"; if it's not there, we're installing, or Health Check will take care of it.
        }
        catch (Exception e)
        {
            // DB not inited or install not complete. No worries, mate.
        }
    }

Я не уверен, где проблема. Я вызываю тот же метод и обновляю кеш; но IIS7 просто показывает мне старую версию.

Я могу отключить кэширование вывода в IIS, но это не то, что я хочу сделать. В лучшем случае это выглядит как хакерский обходной путь.

Ответы [ 3 ]

1 голос
/ 31 января 2012

HTTP-кэш сбрасывается, только если вы делаете это вручную или домен приложения (или пул приложений) сбрасывается по любой причине.Вы уверены, что в этом случае этого не происходит?И вообще говоря, любые глобальные статические переменные также будут храниться в памяти при тех же обстоятельствах.

Существует множество причин, по которым пул приложений может быть сброшен в любой заданной точке, например, изменение web.config.файл и т. д. Я предлагаю проверить, что в вашем случае этого не происходит.

Кстати, кэширование вывода - это другое дело, хотя оно поддерживается в памяти в основном так же.

1 голос
/ 31 января 2012

Без примера кода трудно понять, в чем ваша проблема.Чтобы помочь вам, я часто устанавливаю кэш в своих приложениях:

    public static void SetCache(string key, object value) {
        if (value != null) {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
        }
    }
0 голосов
/ 02 февраля 2012

Учитывая, что это происходит только в IIS7, когда кэширование вывода не отключено, это, скорее всего, будет ошибкой IIS7. Серьезно.

Является ли это или нет, не имеет отношения к решению. Что вам нужно сделать, это найти какой-то ручной процесс аннулирования кэша, например, прикоснуться к файлу web.config.

Но будьте осторожны: это приведет к стиранию кеша (как вы ожидаете), а также всех статических переменных (как побочный эффект). Является ли это еще одной ошибкой или нет, я не знаю; но в моем случае этого было достаточно для решения проблемы.

...