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

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

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

4 ответов


Я думаю, что у меня есть быстрый и грязный раствор. Трюк состоит в том, чтобы изучить элементы управления в заголовке страницы (например, в PreRender phase), найдите ссылки, указывающие на 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 / JS, чтобы последующие вызовы страницы требовали другого файла.

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


когда закончите делать изменения на сайте, измените имя css вручную.


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

добавить это веб.Config

<location path="App_Themes">
    <system.webServer>
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:00:10" />
        </staticContent>
    </system.webServer>
</location>