【问题标题】:caching trouble: dynamic css files缓存问题:动态css文件
【发布时间】:2010-12-18 02:39:09
【问题描述】:

我有一些css文件需要动态生成(为什么很复杂,但是有必要)。简单的解决方案是将文件更改为 aspx 文件,并根据需要使用 标记来注入我想要的值。

这很好,直到我们开始缓存。似乎浏览器和服务器拒绝缓存文件。我试过操纵各种http缓存头,但浏览器总是在每次页面加载时重新获取文件。服务器始终以 HTTP 200(和正确的内容)响应,而不是 304(文件未更改)。

如何说服浏览器和服务器缓存这些动态css文件?

示例消费文件:

<html> <head> <link href="/style.aspx" type="text/css" rel="stylesheet"/> ...

示例样式表,带有缓存头操作(省略文件的动态部分):

<%@ Page Language="C#" ContentType="text/css" EnableSessionState="False" %>
<% Response.Cache.SetLastModified(new DateTime(2009, 11, 18, 10, 1, 0)); Response.Cache.SetMaxAge(TimeSpan.FromDays(30)); Response.Cache.SetETag("4ffff353ff67ff1:0"); %>
...css在这里...

对服务器的请求标头包括以下内容:

If-Modified-Since Wed, 18 Nov 2009 18:01:00 GMT
Cache-Control max-age=0

而相关的服务器响应头是:

Cache-Control private, max-age=2592000
Last-Modified Wed, 18 Nov 2009 18:01:00 GMT
Date Wed, 18 Nov 2009 19:36:07 GMT

有什么想法吗?

【问题讨论】:

  • 您是否在常规 HTML 页面上尝试过缓存设置(和结果)?我的意思是,你确定这是一个 CSS 问题,而不是一个常规的 HTML 页面吗?
  • 是的,一个普通的 aspx 页面在 w.r.t 中表现正确。缓存。

标签: c# css caching dynamic asp.net


【解决方案1】:

您是否尝试过 Response.SetExpires()?这比设置模组日期和最大年龄要简单一些——也许你的浏览器会更喜欢它。

【讨论】:

  • 不幸的是 Response.Cache.SetExpires(...) 不成功。浏览器仍在请求文件。
  • ETag 字符串每次都一样吗?您是否尝试过不使用 ETag(仅使用 SetExpires() 或您的原始代码)?
  • 您是否尝试过检查服务器发送的第一个请求的标头?它是否包含过期标头?
  • 是的,我确保 ETag 每次都相同,但它仍然拒绝缓存它。我也尝试只使用 SetExpires(),但效果不佳。是的,当使用 SetExpires() 方法时,第一个请求的响应标头包含过期标头。标题似乎都井井有条。
  • 每个请求的请求 URI 是否完全不变?它总是同一个域吗?
【解决方案2】:

如何缓存充当 css 文件的 .aspx 页面,使用如下方式:

<%@ OutputCache Duration="60" Location="Client" VaryByParam="None" %>

How to cache in ASP.NET by using Visual C# .NET

【讨论】:

  • 谢谢,我没有看到那个链接。不幸的是,这也不起作用。这正是我所期望的,因为 OutputCache 标记最终相当于对 Response.Cache.*() 的调用,这是我已经尝试过的。
【解决方案3】:

编辑:没有意识到这是一个如此古老的问题,希望这仍然可以帮助那里的人。

你能传递一个虚假的、随机生成的查询字符串来强制重新缓存吗?

例如:

<link href="<%=sStyleSheet%>" type="text/css" rel="stylesheet" />

然后在你的代码隐藏中像这样

Random random = new Random();
int num = random.Next(100000);
string sStyleSheet = "/style.aspx?q=" + num.ToString();

【讨论】:

  • 添加一个随机数会使情况变得更糟,因为它会阻止它们被缓存;我试图让缓存的东西更多,而不是更少。
【解决方案4】:

生成动态文件并将内容类型设置为与 css 相同的 cotent 类型,然后将其视为 css 即使您是动态生成它也无需将其作为 aspx 发送

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多