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

使用Asp.Net主题时,如何强制浏览器重新加载缓存的CSS文件?,asp.net,css,themes,browser-cache,Asp.net,Css,Themes,Browser Cache,可能重复: 我看到了“”,但答案是使用PHP,它没有解决CSS由ASP.Net主题动态注入的问题。我想我有一个快速而肮脏的解决方案。诀窍是检查页眉中的控件(例如在PreRender阶段),在App_Themes文件夹下找到指向CSS文件的链接,并使其动态(通过向查询字符串添加一些随机信息)。这很可能会告诉浏览器使文件的缓存版本无效 守则: protected void Page_PreRender(object sender, EventArgs e) { HtmlLink link

可能重复:


我看到了“”,但答案是使用PHP,它没有解决CSS由ASP.Net主题动态注入的问题。

我想我有一个快速而肮脏的解决方案。诀窍是检查页眉中的控件(例如在
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" />


请注意,您需要在页面的标记中声明
,以便能够访问
标题
属性(否则它将为
null
)。

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

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

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

我还没有找到一种方法来对应用程序主题文件进行版本设置,但您可以将它们设置为在相对较短的时间内过期(例如,10秒),这将最大限度地减少缓存问题,同时为缓存带来一些性能优势。请记住,如果文件没有更改,服务器将响应304 not modified,这样即使浏览器请求文件,通信量也会减少

将其添加到Web.Config的
部分

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


你好,荷马,我不知道这是否有效,因为这只是一个理论。我猜浏览器会缓存css文件,如果能看到它被更改,就会得到一个新版本。我的想法是在css文件中有一个类,它不被使用,并且每个主题都不同。如果该类位于每个css文件的顶部,那么浏览器将读取它,查看不同的类名并重新下载css文件。当然,这一切都是基于假设,没有关于internet explorer如何缓存css的知识。我也很感兴趣,如果其他任何人可以在这个权威发言!我有点困惑-当您使用不同的主题时,样式表位于另一个文件夹中,即/App_Themes/blue/stylesheet.css vs/App_Themes/red/stylesheet.css。该目录更改足以导致它不被缓存。现在,当然red/stylesheet.css仍将被缓存,但如果将主题交换为蓝色,则将加载蓝色的主题(可能会被缓存)。我不是交换主题,只是修改css文件。此方法肯定会终止css浏览器缓存,因为用户每次查看页面时,文件名都会不同。无论如何,我已经读到浏览器不会缓存带有querystring参数的文件。@荷马:他们可能会缓存这样的文件,这取决于实现。如果文件的URI(而不是URL)从未更改,为什么不缓存该文件?@Homer,这个基本想法对我很有用,但我不得不做一些更改。这里是我的更改:protected override void OnPreRender(object sender,EventArgs e)另外,您需要确保在方法完成之前调用基方法。您可以通过从文件上的上次修改日期生成刻度来完成此操作-当然会更慢,但会正确反映文件w.r.t.缓存的状态。请注意DateTime.Now.Ticks。永久禁用所有缓存;这将使你的网站慢很多。使用文件日期/时间,可能需要额外的逻辑来停止频繁检索。知道如何在ASP.Net中执行此操作(动态更改文件名,而不是CTRL-F5)吗?我使用的一种方法是在服务器上重写规则,重定向对特定模式文件的任何请求(/css/mycssfile.201104056554433.css)到没有时间戳的真实文件。这样,浏览器将每个请求视为对唯一文件的请求,而您的服务器可以盲目地返回对该文件的请求,而不考虑实际的时间戳。您只需要记住在asp页面中动态更改每个请求所请求的css文件名(很简单,只需在每个请求上插入当前时间戳)。