我想问一下是否有办法阻止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,但它不起作用。
提前致谢。
答案 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]", ""))" />