Предотвратить программное кэширование сценариев - PullRequest
1 голос
/ 21 февраля 2011

Я хотел бы спросить, есть ли способ запретить Firefox кэшировать скрипты (файлы .js).

У меня есть проект (ASP.Net Web App) с проблемой кеширования в Firefox. Когда я впервые запускаю приложение (сценарий кэшируется в Firefox), модифицирую сценарий и перезапускаю приложение, Firefox использует кэшированный сценарий вместо обновленного.

Я использую Firefox 3.6.13.

Я уже пытался использовать HttpHeaders, но похоже, что Firefox игнорирует мои коды.

Вот мой код:

    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
    HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    HttpContext.Current.Response.Cache.SetNoStore();

Я пытался разместить этот код в global.asax> Application_BeginRequest и в MasterPage.aspx.cs> Page_Load, но он не работает.

Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 21 февраля 2011

Один из методов - добавить случайный элемент в URL в виде строки запроса, чтобы браузер не знал, как кэшировать скрипт:

<script src="jquery.js?<%=DateTime.Now.Ticks %>" />

Еще лучше добавить текущий номер сборкивашей сборки, так что вы получаете преимущества производительности кэширования сценария, пока сценарий не изменился.Однако это работает только в том случае, если вы никогда не меняете свои файлы сценариев «вне диапазона» в своих двоичных выпусках.

1 голос
/ 27 июля 2012

1) Установите модуль IIS: http://www.iis.net/download/urlrewrite

2) Поместите это в web.config в раздел:

 <rewrite>
    <rules>
      <rule name="Style Rewrite" stopProcessing="true">
        <match url="^v(.*?)/styles/(.*)" />
        <action type="Rewrite" url="/styles/{R:2}" />
      </rule>
      <rule name="Javascript Rewrite" stopProcessing="true">
        <match url="^v(.*?)/javascript/(.*)" />
        <action type="Rewrite" url="/javascript/{R:2}" />
      </rule>
    </rules>
  </rewrite>

3) Напишите эту вспомогательную функцию (в некоторый глобальный класс)

public static string PutCSS(string filepath)
{
    FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(filepath));
    string timestamp = f.LastWriteTimeUtc.Year.ToString() + f.LastWriteTimeUtc.Month.ToString() + f.LastWriteTimeUtc.Day.ToString() + f.LastWriteTimeUtc.Hour.ToString() + f.LastWriteTimeUtc.Minute.ToString() + f.LastWriteTimeUtc.Second.ToString() + f.LastWriteTimeUtc.Millisecond.ToString();
    return "<link type=\"text/css\" rel=\"stylesheet\" href=\"v" + timestamp + "/" + filepath + "\" />\n";
}

public static string PutJS(string filepath)
{
    FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(filepath));
    string timestamp = f.LastWriteTimeUtc.Year.ToString() + f.LastWriteTimeUtc.Month.ToString() + f.LastWriteTimeUtc.Day.ToString() + f.LastWriteTimeUtc.Hour.ToString() + f.LastWriteTimeUtc.Minute.ToString() + f.LastWriteTimeUtc.Second.ToString() + f.LastWriteTimeUtc.Millisecond.ToString();
    return "<script type=\"text/javascript\" src=\"v" + timestamp + "/" + filepath + "\" ></script>\n";
}

4) Вместо:

<link href="Styles/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="Javascript/userscript.js" ></script>

Использование:

<%= global.PutCSS("Styles/style.css")%>
<%= global.PutCSS("Javascript/userscript.css")%>
1 голос
/ 22 февраля 2011

Вы должны иметь возможность использовать

HttpContext.Current.Response.Cache.SetCacheability (HttpCacheability.NoCache);

, но вам потребуется httpобработчик, который отображает сценарий непосредственно в поток ответов и затем устанавливает исходный URL-адрес тега сценария для обработчика или настраивает IIS для обработки всех сценариев JavaScript с помощью определенного обработчика: Укажите * .js на расширение ISAPI aspnet_isapi.dll и затем добавьте в ваш web.config следующее:

<system.web>
    <httpHandlers>
        <!-- javascript handler -->
        <add verb="*" path="*.js" 
         type="skmHttpHandlers.JavascriptHandler, skmHttpHandlers" />
    </httpHandlers>

И чем обработчик:

namespace skmHttpHandlers
{
   public class JavascriptHandler : IHttpHandler
   {
      public void ProcessRequest(HttpContext context)
      {
         context.Response.Clear();
         context.Response.Cache.SetCacheability(HttpCacheability.NoCache)
         using (var scriptStream = File.Open(Server.MapPath("~/script/TheScript.js"), FileMode.Open))
           scriptStream.CopyTo(context.Response.OutputStream);
         context.Response.End();
      }

      public bool IsReusable
      {
         get
         {
            return false;
         }
      }
   }
}
0 голосов
/ 31 июля 2018

Я ХОЧУ, чтобы скрипты и стили были кэшированы ... перезагружать их только после их изменения ... Использовать дату файла легко:

<script type="text/javascript" src="~/js/custom.js?d=@(System.Text.RegularExpressions.Regex.Replace(File.GetLastWriteTime(Server.MapPath("~/js/custom.js")).ToString(),"[^0-9]", ""))"></script>


<link rel="stylesheet" href="~/css/custom.css?d=@(System.Text.RegularExpressions.Regex.Replace(File.GetLastWriteTime(Server.MapPath("~/css/custom.css")).ToString(),"[^0-9]", ""))" />
0 голосов
/ 05 ноября 2014
<head runat="server">
    <%= "<link href='/asset/Style.css?v" + new Random().Next(1000,9999).ToString() + "' rel='stylesheet' />" %>
</head>
0 голосов
/ 23 февраля 2011

Если у вас есть контроль над конфигурацией IIS, вы можете поместить все свои сценарии в одну папку и указать IIS немедленно прекратить содержимое или добавить другие настраиваемые заголовки по вашему выбору.

Соответствующая страница для IIS6,0 http://technet.microsoft.com/en-us/library/cc732442.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...