2012-06-13 62 views
4

在我的应用程序中,用户可以选择修改其网站的CSS。输出缓存动态生成CSS

这种情况不太可能经常发生变化,但是当它发生时,我们需要确保他们及其网站访问者立即看到结果。

我们记录了用户更新其CSS的日期和时间,因此一个简单的解决方案就是将时间戳附加到URL。

但是,我想知道是否可以通过编程方式设置缓存标头,以便强制浏览器在发生更改时重新请求CSS文件。

回答

4

如果包括散列您的网址,即

http://server.example.com/styles/css.css?hash 

它会被加载时哈希值发生变化,因为浏览器会在新的URL取,

版本1:

<style type="text/css" link="styles/css.css?hash=v1" /> 

版本2:

<style type="text/css" link="styles/css.css?hash=v2" /> 

客户端缓存是客户端问题,让他们按照他们认为合适的方式进行:新的URL意味着资源已更改,因此需要重新加载。由于不同的客户端实现,使用缓存控制标头保持相同的URL可能会导致您痛苦的世界。

如果你把缓存控制头(最后一次修改,过期,ETAG),你不能确定你的CSS将得到刷新,当它改变:

  • 因为激进的浏览器(或代理)缓存可以忽略不计那些。
  • 因为您可能会在5月1日为V1提供服务,并且有效日期为6月1日,因此在5月15日将其更新为V2,您的客户必须等待15天才能获得新版本。

使用url散列,最糟糕的情况是客户端不会将您的css放入缓存中,但用户体验不会改变,因为它们总是获取最新版本。

随着到期日或最后修改日期,最坏的情况是,客户得到的是旧版本,而这将改变用户体验:)

+0

请重新阅读我的问题。我知道我可以附加一些东西到网址,但我想知道如何通过设置缓存标题来做到这一点。 –

+0

这是不一样的。缓存头是响应的一部分。该网址启动请求。 – mathieu

+0

感谢您的更新回复。客户端是否不尊重缓存最后修改日期? –

1

感谢马修的回应我使用的输出缓存的组合版本号来处理缓存失效。

输出缓存配置文件:

我创建了下面的扩展方法追加时间戳:

public static string AppendTimeStamp(this string src, DateTime lastModified) 
    { 
     if (string.IsNullOrEmpty(src)) 
      return src; 

     return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss")); 
    } 

用法:

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/> 

在你不案例”我想永远缓存文件,你可以通过DateTime.UtcNow作为最后修改日期。