缓存问题:动态CSS文件

4
我有一些需要动态生成的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 here...

发送到服务器的请求头包括以下内容:

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页面吗? - Ron Klein
没错,一个普通的aspx页面在缓存方面表现正常。 - Ken Mason
4个回答

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

0

谢谢,我之前没有看到那个链接。不幸的是,那也没用。这正是我所预料的,因为OutputCache标记最终相当于调用Response.Cache.*(),而这正是我已经尝试过的。 - Ken Mason

-1
编辑:没意识到这是一个很旧的问题,希望这依然能对某个人有所帮助。
你能传递一个虚假的、随机生成的查询字符串来强制重新缓存吗?
例如:
<link href="<%=sStyleSheet%>" type="text/css" rel="stylesheet" />

然后在你的 codebehind 中加入类似如下代码

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

添加一个随机数会使情况变得更糟,因为它会防止它们被缓存;我正在尝试让事情被更多地缓存,而不是更少。 - Ken Mason

-1
你尝试过使用Response.SetExpires()了吗?这比设置修改日期和最大年龄要简单一些,也许你的浏览器会更喜欢它。

很遗憾,Response.Cache.SetExpires(...) 操作失败了。浏览器仍在请求该文件。 - Ken Mason
ETag字符串每次都是相同的吗?您是否尝试过不使用ETag(仅使用SetExpires()或原始代码)? - Ray
你尝试过检查服务器发送的第一个请求的头部吗?它包含过期头吗? - Salman A
是的,我确保每次ETag都相同,但它仍然拒绝缓存。我还尝试仅使用SetExpires(),但没有效果。是的,当使用SetExpires()方法时,第一个请求的响应头包含了预期的过期标头。所有头似乎都是正确的。 - Ken Mason
每个请求的请求URI是否完全不变?它总是相同的域名吗? - Pekka
是的,URI在每个请求中都是相同的,包括FQDN。 - Ken Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接