C# ASP.NET MVC OutputCache不存储自定义标头

C# ASP.NET MVC OutputCache不存储自定义标头,c#,asp.net-mvc,caching,C#,Asp.net Mvc,Caching,我的应用程序使用ASP.NET MVC 5和OutputCache(具体来说,我们使用MVCDonutCache)来缓存高流量站点和昂贵的路由 一些操作有一个自定义的ActionFilter,它根据视图模型添加一个内容范围标题。没有缓存,它就像魅力一样。启用缓存后,第一次命中是正常的(响应中存在内容范围头)-但第二次命中仅包含内容类型和HTML/JSON响应,并且缺少自定义的内容范围头(这破坏了客户端功能) 有没有办法在不编写自己的OutputCache实现的情况下启用适当的头缓存 非常感谢。缓

我的应用程序使用ASP.NET MVC 5和OutputCache(具体来说,我们使用MVCDonutCache)来缓存高流量站点和昂贵的路由

一些操作有一个自定义的ActionFilter,它根据视图模型添加一个
内容范围
标题。没有缓存,它就像魅力一样。启用缓存后,第一次命中是正常的(响应中存在
内容范围
头)-但第二次命中仅包含
内容类型
和HTML/JSON响应,并且缺少自定义的
内容范围
头(这破坏了客户端功能)

有没有办法在不编写自己的OutputCache实现的情况下启用适当的头缓存

非常感谢。

缓存的响应是一个“304-未修改”HTTP响应,这种响应不会返回实体头(除了一些异常,如“上次修改”)

您尝试返回的“内容范围”标题是实体标题:

以下是实体标题的完整列表:

304不返回实体头的原因是304响应不应该返回目标资源的完整表示,因为没有任何更改

304(未修改)状态代码表示条件GET 或已收到HEAD请求并将导致200 (OK)如果不是因为该条件已发生的事实,则响应 评估结果为假。换句话说,不需要服务器 传输目标资源的表示形式,因为 request表示发出请求的客户端 有条件的,已经有有效的陈述

这意味着不应再次传输实体头。这确保了一致性,并具有一些性能优势

如果使用强缓存验证器(参见第13.3.3节),则响应不应包括其他实体头。否则(即,使用弱验证器的条件GET),响应不得包括其他实体头;这可以防止缓存实体和更新的头之间的不一致

我的结论是ASP.NET和IIS正确地解释了此规范,您尝试执行的操作不受支持。这方面的一个证明是,Apache和其他流行的web服务器也像上面解释的那样做


如果您的304中仍然需要该标头,则必须识别并更换(如果可能)负责过滤304响应的组件。

它是发出请求还是使用本地缓存的请求,OutputCache设置的目的是什么?请求被发送到服务器并由服务器应答。请求通过路由并在
DonutOutputCache
ActionFilter上停止,该过滤器提供原始Http内容的副本,设置内容类型和一些缓存标头。自定义标头操作筛选器批注是在输出缓存批注之前还是之后?