gpt4 book ai didi

asp.net-mvc - 将 MVC.NET OutputCache 配置为在 ActionResult 未更改时返回 304 Not Modified

转载 作者:行者123 更新时间:2023-12-03 20:15:56 25 4
gpt4 key购买 nike

问题介绍
如果服务器指示 304 Not Modified,我们已成功配置浏览器缓存以返回保存的响应。 .这是配置:

<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add
name="TransparentClient"
location="Client"
duration="0" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
web.config 是完美的并设置了 Cache-control:private, max-age=0以便:
  • 浏览器会缓存响应,
  • 将始终验证缓存,并且
  • 如果服务器响应 304,将返回缓存的响应。

  • 问题是我们的 MVC.NET Actions 总是响应 200 而不是 304。
    问题
    当 ActionResult 没有改变时,我们如何配置输出缓存以返回 304 Not Modified?
  • MVC.NET 中是否有任何内置的缓存验证?
  • 如果不是,我们如何推出自己的缓存验证机制?

  • roll-our-own 可能需要一个带有 ETag 或 Last-Modified 的操作过滤器。
    屏幕截图
    这是显示缺少 304 的 Fiddler 屏幕截图。
  • 318 是 SHIFT + 刷新。
  • 332 是我们预期会导致 304 的刷新。 问题。

  • Fiddler Web Debugger
    搜索和研究
    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,这将允许添加/删除 header 。

    最佳答案

    以下是为我们工作。

    网页配置

    套装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

    Fiddler 显示缓存运行正常。

    Successful Fiddler

    关于asp.net-mvc - 将 MVC.NET OutputCache 配置为在 ActionResult 未更改时返回 304 Not Modified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23775040/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com