介绍问题
如果服务器指示304 Not Modified
,我们已成功配置浏览器缓存以返回已保存的响应。这是配置:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add
name="TransparentClient"
location="Client"
duration="0" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
web.config很完美,并设置Cache-control:private, max-age=0
以便:
问题是我们的MVC.NET动作总是响应200而不是304。
问题
当ActionResult没有改变时,我们如何配置输出缓存以返回304 Not Modified?
roll-our-own可能需要一个带ETag或Last-Modified的动作过滤器。
屏幕截图
这是一张Fiddler截图,显示缺少304。
搜索和研究
ASP.NET MVC : how do I return 304 "Not Modified" status?提到从Action中返回304。这并没有提供一种使OutputCache准确响应304的方法。
Working with the Output Cache and other Action Filters显示了如何覆盖OnResultExecuted,这将允许添加/删除标题。
答案 0 :(得分:5)
以下内容适用于我们。
设置Cache-Control:private,max-age-0
以启用缓存并强制重新验证。
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="TransparentClient" duration="0" location="Client" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
如果未修改响应,则回复304。
[MyOutputCache(CacheProfile="TransparentClient")]
public ActionResult ValidateMe()
{
// check whether the response is modified
// replace this with some ETag or Last-Modified comparison
bool isModified = DateTime.Now.Second < 30;
if (isModified)
{
return View();
}
else
{
return new HttpStatusCodeResult(304, "Not Modified");
}
}
删除Cache-Control:private,max-age-0
否则缓存将存储状态消息。
public class MyOutputCache : OutputCacheAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
if (filterContext.HttpContext.Response.StatusCode == 304)
{
// do not cache the 304 response
filterContext.HttpContext.Response.CacheControl = "";
}
}
}
Fiddler表明缓存行为正常。