Как заставить браузеры перезагружать кэшированные CSS-файлы при использовании тем Asp.Net?

Возможный дубликат:
CSS в папке App_Theme становится кэшированным в браузере

Я видел " Что такое элегантный способ заставить браузеры перезагружать кэшированные файлы CSS/JS?", Но в этом ответе используется PHP, и он не учитывает тот факт, что CSS вводится динамически темой ASP.Net.

4 ответа

Решение

Я думаю, что у меня есть быстрое и грязное решение. Хитрость заключается в том, чтобы проверить элементы управления в заголовке страницы (например, в PreRender фаза), найдите ссылки, указывающие на CSS-файлы, в разделе App_Themes папку и сделайте их динамическими (добавив некоторую случайную информацию в строку запроса). Это, скорее всего, скажет браузеру аннулировать кэшированную версию файла.

Код:

protected void Page_PreRender(object sender, EventArgs e)
{
    HtmlLink link = null;

    foreach (Control c in Header.Controls)
    {
        if (c is HtmlLink)
        {
            link = c as HtmlLink;

            if (link.Href.IndexOf("App_Themes/", StringComparison.InvariantCultureIgnoreCase) >= 0 &&
                link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
            {
                link.Href += string.Format("?t={0}", DateTime.Now.Ticks.ToString());
            }
        }
    }
}

Выход:

    <link href="App_Themes/MyTheme/MyTheme.css?t=634310637798128189" 
        type="text/css" rel="stylesheet" />

Обратите внимание, что вам нужно иметь <head runat="server"> объявлен в разметке вашей страницы, чтобы иметь возможность доступа к Header собственность (иначе это будет null).

По окончании внесения изменений на сайт измените название css вручную.

Если вы спрашиваете, как сторона SERVER может принудительно перегрузить... Один из способов - динамически изменить имя файла CSS/JS, чтобы при последующих вызовах страницы требовался другой файл.

<sarcasm>Другой способ - просто сказать пользователю нажать CTRL-F5:)</sarcasm>

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

Добавьте это к <configuration> раздел Web.Config

<location path="App_Themes">
    <system.webServer>
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:00:10" />
        </staticContent>
    </system.webServer>
</location>
Другие вопросы по тегам