在404响应上设置Http Cache Headers是否有意义?

时间:2010-10-11 19:18:25

标签: asp.net-mvc http iis-7

我有一个数据库存储可以通过主键ID访问的图像(呕吐物,我知道,但它不受我的控制)。

我有一个非常标准的Asp .net Mvc Controller来读取数据库,如果在数据库中找到一行,它会将图像字节作为FileResult返回。如果找不到行,我有一个自定义操作结果,将响应状态设置为404.我不会抛出异常,而是让IIS处理404状态并返回静态文件。

public class ContentMediaNotFoundResult : ActionResult
{
    public ContentMediaNotFoundResult() { }

    public override void ExecuteResult(ControllerContext context)
    {
        //-- Here the only thing we are doing is setting the Response code to 404 and then we are   going to let IIS service the request
        //-- based on the settings in system.webServer/httpErrors (which may come from the root .config, so be careful)
        context.HttpContext.Response.StatusCode = 404;
    }
}

最近,我们在Firefox v3.6.1上进行了测试,并注意到浏览器正在为每个图像发出多个请求(准确地说是3个),因此我们的控制器工厂被点击了3次并从我们的数据库中进行了3次访问数据库行动方法。这种行为只是来自Firefox(IE,Chrome正常)。

我的问题是,在我的ContentMediaNotFoundResult中将Http Cache Headers添加到404响应中是否有意义,这样我的action方法就不会持续访问数据库。

3 个答案:

答案 0 :(得分:2)

当然,您可以为404设置缓存标头。正如@Darin所提到的,缓存老化可能会影响替换404'd图像的任何问题,但这与缓存任何可能更改的对象的问题相同。

似乎只有5xx错误可能不应该被缓存,但是4xx很好。

答案 1 :(得分:1)

在404页面上设置缓存标头没有任何意义,因为如果稍后将具有此id的图像添加到数据库,则用户仍将获得404。也许您应该尝试理解为什么FireFox会向此网址发送3个请求。

答案 2 :(得分:1)

我认为这取决于。如果您有一个快速变化的Web API,可能随时添加资源,那么您希望客户端始终查询原点。

如果你有很多内容没有太大变化,那么缓存404可能会有很多帮助。

查看这个真实世界的例子:

http://highscalability.com/blog/2010/3/26/strategy-caching-404s-saved-the-onion-66-on-server-time.html