【发布时间】:2021-08-26 06:44:58
【问题描述】:
startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
services.AddResponseCaching();
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors();
app.UseResponseCaching();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
TestController.cs
[ApiController]
public class TestController : ControllerBase
{
[ResponseCache(Duration = 60)]
[HttpGet("/fail")]
public IActionResult Fail()
{
return BadRequest();
}
}
当我点击 /fail 端点时,它按预期返回 400 状态,但由于操作方法上的 ResponseCache 属性,它具有 public,max-age=60 的 Cache-Control 标头。根据docs,
响应缓存中间件仅缓存导致 200 (OK) 状态代码的服务器响应。中间件会忽略任何其他响应,包括错误页面。
如何阻止错误响应(或任何非 200 响应)被缓存?
【问题讨论】:
-
您引用的注释是指响应缓存中间件未缓存完整响应服务器端。
ResponseCacheFilter作为 MVC 操作过滤器运行,在设置缓存标头时似乎没有考虑状态代码。 -
@KirkLarkin 是的,感谢您提供的信息。我最初并没有使用响应缓存中间件,我只是在尝试解决问题时添加了它。那么人们通常如何解决这个问题呢?他们只是接受浏览器会缓存任何错误响应?如果错误是暂时的,浏览器刷新可能会解决问题,但如果它正在缓存错误响应,则无法解决。
标签: asp.net asp.net-core caching asp.net-web-api cache-control