Caching 强制浏览器缓存对Castle MonoRail操作的请求?

Caching 强制浏览器缓存对Castle MonoRail操作的请求?,caching,http-headers,castle-monorail,Caching,Http Headers,Castle Monorail,在我们的项目中,我们有一大堆小的css/js文件,因此当我们构建视图时,我们发现自己编写了许多或标记,迫使浏览器对我们的css/js内容发出许多请求。为了解决这个问题,我们开始寻找一种方法,让服务器将所有这些都支持到一个请求中,将每个css文件或与操作相关的每个js文件转储到响应中 在不涉及太多细节的情况下,我们创建了一个Helper类,该类接受文件,连接文件,并呈现如下标记: ContentController然后有一个默认操作,该操作使用“js15628453”查找助手存储连接文件的位置并

在我们的项目中,我们有一大堆小的css/js文件,因此当我们构建视图时,我们发现自己编写了许多
标记,迫使浏览器对我们的css/js内容发出许多请求。为了解决这个问题,我们开始寻找一种方法,让服务器将所有这些都支持到一个请求中,将每个css文件或与操作相关的每个js文件转储到响应中

在不涉及太多细节的情况下,我们创建了一个Helper类,该类接受文件,连接文件,并呈现如下标记:

ContentController然后有一个默认操作,该操作使用“js15628453”查找助手存储连接文件的位置并将其流式输出。这真的很有效

但是,正如Firebug报告的那样,浏览器总是向“/content/js15628453.rails”发送请求以获取连接的文件,尽管URL始终相同,响应也始终相同。我已经尝试了HTTP
缓存控制
过期
上次修改
等标题的所有类型的组合,但尚未获得Firebug报告的从缓存加载的内容


为什么浏览器会忽略这些标题?还有其他方法可以强制缓存吗?

好吧,我想出来了,为了那些可能在搜索引擎中找到它的人的利益,我将继续回答我自己的问题

基本上,我必须自己编写逻辑来设置304状态:

DateTime lastModified = // some date
string ifModifiedSince = Request.Headers["If-Modified-Since"];
if ( ifModifiedSince != null )
{
    var requestDate = DateTime.Parse( ifModifiedSince );
    if ( requestDate <= lastModified )
    {
        CancelView();
        Response.StatusCode = 304;
        return;
    }
}

Response.CachePolicy.SetLastModified( lastModified );

// Logic to write the file to the OutputStream
DateTime lastModified=//某个日期
字符串ifModifiedSince=Request.Headers[“如果自”]起修改”;
if(ifModifiedSince!=null)
{
var requestDate=DateTime.Parse(ifModifiedSince);
如果(requestDate@Tinister:
实际上,你要做的是处理条件GET
也就是说,当一个Get请求从一个客户端转到另一个服务器时,询问“您有比X更新的吗”,服务器会说304如果没有。
您确实避免了服务器生成js和js内容的流量,但是请求的成本(即从浏览器向服务器发送http请求)仍然存在。
这些内容由最后修改的/IfMOdifiedThen头(一个用于响应,一个用于请求)和/或ETAG头处理

缓存是另一回事——当浏览器决定根本不发出GET请求时。它由“Expires”头或缓存控制头管理

您可能在某个地方设置了一个缓存控制头,它使客户端忽略“Expires”。 尝试设置“max age 3600”或类似的设置,查看是否正在缓存请求(忘记FB-而是在服务器上设置断点或登录以确保未调用该请求)

话虽如此,在处理js/css文件时,您可能不需要实际的缓存。这是因为如果浏览器确实决定缓存,比如一周,那么您无法强制它重新加载新版本。因此,如果您将新版本部署到服务器上,则无论新时间是什么,客户端直到一周过去后才会看到它(oe etag)新资源的名称是-因为它甚至不会发出条件GET请求


一种解决方案(如果您真的想减轻网络预压力)是将缓存设置为最长时间(比如一年),当资源更改时,您可以更改URI(按原样-添加任意查询字符串值)。这将迫使浏览器重新加载新的js资源,并且不再打扰服务器,至少在下一次更新+下一个资源URI之前。

我注意到,在计算是否处理HEAD请求以检查“未修改”时,至少firefox似乎使用了初始请求中的“上次修改”标记(304)响应代码

有一个非常旧的“last modified”时间戳似乎会导致它不检查文件的任何新版本,除非明确要求

然而,我不太相信这一点