2011-01-19 1 views
7

Можно создать дубликат:
CSS in App_Theme folder gets Cached in BrowserКак заставить браузеры перезагружать кэшированные файлы CSS при использовании Темы Asp.Net?

Я видел «What is an elegant way to force browsers to reload cached CSS/JS files?», но ответ там использует PHP и не учитывает тот факт, что CSS впрыскивается динамически с помощью ASP .Net Theme.

+0

Привет Гомер, я не знаю, будет ли это работать или нет, как его просто теория. Я предполагаю, что браузеры кэшируют файл css и получают новую версию, если видят, что она изменена. Моей идеей было бы иметь класс в файле css, который не используется и не отличается для каждой темы. Если этот класс находится в верхней части каждого файла css, браузер должен его прочитать, увидеть другое имя класса и загрузить файл css. Это, конечно, все основывается на предположениях и не знает, как интернет-браузер кэширует css. Мне было бы интересно также, если кто-нибудь еще может говорить с этим авторитетом! – WraithNath

+0

Я немного смущен. Когда вы используете другую тему, таблица стилей находится в другой папке, т.е. /App_Themes/blue/stylesheet.css vs /App_Themes/red/stylesheet.css. Это изменение каталога достаточно, чтобы заставить его не кэшироваться. Теперь, конечно, красный/стиль.css все равно будет кэшироваться, но если вы поменяете темы на синий, это будет загружать синий (который может быть кэширован). – Prescott

+0

Я не обмениваю темы, просто изменяя файл css. – Homer

ответ

13

Я думаю, что у меня быстрое и грязное решение. Хитрость заключается в проверке элементов управления в заголовке страницы (например, на этапе 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).

+0

Этот метод определенно уничтожит кеширование css-браузера, поскольку имя файла будет отличаться при каждом просмотре страницы пользователем. Во всяком случае, я читал, что браузеры не будут кэшировать файлы с параметром querystring. – Homer

+0

@Homer: Они могут кэшировать такие файлы, это зависит от реализации. Почему бы не кешировать файл, если его URI (а не URL-адрес) никогда не изменяется? – volpav

+0

@ Гомер, эта основная идея работала для меня, но мне пришлось немного изменить. Вот мое изменение: protected override void OnPreRender (отправитель объекта, EventArgs e) Кроме того, вы должны убедиться, что вы вызываете базовый метод до завершения метода. –

1

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

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

+0

Любая идея, как это сделать в ASP.Net (динамически менять имя файла, а не CTRL-F5)? – Homer

+2

Один из методов, который я использовал, - это переписать правила на сервере, перенаправляя любой запрос файла определенного шаблона (/css/mycssfile.201104056554433.css) в реальный файл, который не имеет метки времени. Таким образом, браузер обрабатывает каждый запрос как запрос для уникального файла, и ваш сервер может просто слепо вернуть запрос на файл, независимо от фактической метки времени. Вам просто нужно запомнить на своей странице asp динамическое изменение запрашиваемого имени файла css по каждому запросу (просто, просто вставьте текущую метку времени для каждого запроса). – Dekker500

1

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

1

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

Добавьте к этому <configuration> секции Web.Config

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