Outputcache 和 410 状态响应不起作用

Mik*_*ynn 7 .net asp.net-mvc caching outputcache http-status-code-410

我想为执行一些数据库查找的页面抛出 410 状态代码。然而,outputcache 似乎只缓存 200 个状态代码页。有没有办法解决?我想将 410 页缓存一段时间,这样数据库就无法获取它,但它只是跳过缓存并再次访问数据库。

[OutputCache(Duration = 3600, VaryByParam = "eventid,teamid,v,r")]
    public virtual ActionResult Team(int? teamId, int? eventId)
    {
Run Code Online (Sandbox Code Playgroud)

Aka*_*ava 2

OutputCache 和几乎所有 HTTP 级别的缓存都被设计为忽略失败的响应,除了 399 之外的任何内容,所有高于 399 的状态代码都是错误代码。

\n

您可以手动设置响应标头,例如

\n
context.Response.Headers.CacheControl = "public, max-age=3600"\n
Run Code Online (Sandbox Code Playgroud)\n

这是OutputCache内部所做的,但是,OutputCache如果设置的话,也可能提供服务器级缓存。

\n

但如果您使用 CDN,我怀疑他们会在响应状态代码失败的情况下尊重缓存控制。

\n

但不建议这样做。假设由于某种原因用户删除了 cookie 或 cookie 被损坏。用户收到 410 错误。用户返回登录并正确登录,现在对于同一请求,用户将继续收到 410 一小时。

\n

或者让\xe2\x80\x99s 说你的数据库不可用并且数据库抛出410错误,所以即使有有效的cookie或有效的授权,用户也会收到缓存的错误响应。缓存层不知道何时不缓存。

\n

相反,您可以使用MemoryCache, 将错误结果缓存在内存中几秒钟,而不必每次都访问数据库。尽管结果仍然会到达网络服务器。

\n

CloudFlare 和 Azure 提供 Web 应用程序防火墙,如果您担心 DDOS 类型的攻击,它可以智能地阻止错误流量。这种方法似乎比使用 HTTP 缓存更好,因为您无法控制用户的缓存。并且您无法在成功登录后以编程方式清除缓存。

\n