在使用Asp.Net主题时,如何强制浏览器重新加载缓存的CSS文件?

时间:2011-01-19 15:09:03

标签: asp.net css themes browser-cache

  

可能重复:
  CSS in App_Theme folder gets Cached in Browser

我见过“What is an elegant way to force browsers to reload cached CSS/JS files?”,但答案是使用PHP,并没有解决CSS由ASP.Net主题动态注入的事实。

4 个答案:

答案 0 :(得分:13)

我想我有一个快速而肮脏的解决方案。诀窍是检查页眉中的控件(例如在PreRender阶段),找到指向App_Themes文件夹下的CSS文件的链接并使其动态化(通过添加一些随机信息)到查询字符串)。这很可能会告诉浏览器使文件的缓存版本无效。

代码:

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)。

答案 1 :(得分:1)

如果你问SERVER端如何强制重新加载......一种方法是动态更改CSS / JS的文件名,以便后续调用页面需要不同的文件。

<sarcasm> 另一种是简单地告诉用户按CTRL-F5 :) </sarcasm>

答案 2 :(得分:1)

完成对网站的更改后,手动更改css的名称。

答案 3 :(得分:1)

我还没有找到一种方法来版本化App_Themes文件,但你可以将它们设置为在相对较短的时间内(例如10秒)过期,这样可以最大限度地减少缓存问题,同时为您提供一些性能缓存的好处。请记住,如果文件没有更改,服务器将响应304-Not modified,因此即使浏览器请求文件,流量也会减少。

将其添加到Web.Config的<configuration>部分

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