我有一个数据库存储可以通过主键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方法就不会持续访问数据库。
答案 0 :(得分:2)
当然,您可以为404设置缓存标头。正如@Darin所提到的,缓存老化可能会影响替换404'd图像的任何问题,但这与缓存任何可能更改的对象的问题相同。
似乎只有5xx错误可能不应该被缓存,但是4xx很好。
答案 1 :(得分:1)
在404页面上设置缓存标头没有任何意义,因为如果稍后将具有此id的图像添加到数据库,则用户仍将获得404。也许您应该尝试理解为什么FireFox会向此网址发送3个请求。
答案 2 :(得分:1)
我认为这取决于。如果您有一个快速变化的Web API,可能随时添加资源,那么您希望客户端始终查询原点。
如果你有很多内容没有太大变化,那么缓存404可能会有很多帮助。
查看这个真实世界的例子: