Sha*_*tin 7 asp.net-mvc outputcache
介绍问题
我们已成功配置浏览器缓存,以便在服务器指示时返回已保存的响应304 Not Modified.这是配置:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add
name="TransparentClient"
location="Client"
duration="0" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Run Code Online (Sandbox Code Playgroud)
web.config是完美的,并设置Cache-control:private, max-age=0为:
问题是我们的MVC.NET动作总是响应200而不是304.
问题
当ActionResult没有改变时,我们如何配置输出缓存以返回304 Not Modified?
roll-our-own可能需要一个带ETag或Last-Modified的动作过滤器.
屏幕截图
这是一个显示缺少304的Fiddler截图.

搜索和研究
ASP.NET MVC:如何返回304"未修改"状态?提到从Action中返回304.这没有提供使OutputCache准确响应304的方法.
使用输出缓存和其他操作过滤器显示如何覆盖OnResultExecuted,这将允许添加/删除标头.
以下内容适用于我们.
设置Cache-Control:private,max-age-0为启用缓存并强制重新验证.
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="TransparentClient" duration="0" location="Client" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
Run Code Online (Sandbox Code Playgroud)
如果未修改响应,则回复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");
}
}
Run Code Online (Sandbox Code Playgroud)
删除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 = "";
}
}
}
Run Code Online (Sandbox Code Playgroud)
Fiddler表明缓存行为正常.

| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |