防止以编程方式缓存脚本

时间:2011-02-21 07:26:17

标签: c# asp.net firefox caching

我想问一下是否有办法阻止Firefox缓存脚本(.js文件)。

我在firefox上有一个带缓存问题的项目(ASP.Net Web App)。当我第一次运行应用程序(脚本缓存在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 个答案:

答案 0 :(得分:3)

一种技巧是将随机元素作为查询字符串添加到URL,因此浏览器不知道如何缓存脚本:

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

更好的方法是附加程序集的当前内部版本号,以便在脚本未更改时获得脚本缓存的性能优势。但是,如果您从未使用二进制版本“带外”更改脚本文件,则此方法才有效。

答案 1 :(得分:1)

你应该可以使用

  

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

但是你必须有一个http处理程序,它将脚本直接呈现给响应流,而不是将脚本标记的源url设置为处理程序,或者配置IIS以使用特定处理程序处理所有javascripts: 将* .js指向aspnet_isapi.dll ISAPI扩展,然后在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;
         }
      }
   }
}

答案 2 :(得分:1)

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")%>

答案 3 :(得分:0)

如果您可以控制IIS配置,那么您可以将所有脚本放在一个文件夹中,并告诉IIS立即使内容过期,或者添加您选择的其他自定义标头。

IIS 6.0的相应页面为http://technet.microsoft.com/en-us/library/cc732442.aspx

答案 4 :(得分:0)

<head runat="server">
    <%= "<link href='/asset/Style.css?v" + new Random().Next(1000,9999).ToString() + "' rel='stylesheet' />" %>
</head>

答案 5 :(得分:0)

我想要缓存的脚本和样式...仅在它们更改时才重新加载...使用文件的日期很容易:

<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]", ""))" />