不幸的是 .net 核心中的 ResponseCache 属性的当前状态不是。希望以后会有所改进。也许你可以在他们的 repo 上提交一个问题,以便有人知道对其进行编码并提交一个拉取请求?
有一个社区构建的替代方案,可为您提供所需的功能。
https://github.com/KevinDockx/HttpCacheHeadershttps://www.nuget.org/packages/Marvin.Cache.Headers
您不能也将持续时间设置为 60 * 60 * 24 (#SecondsInADay) 吗?或者您的数据是否需要在一天中的某个确切时间刷新?
另一种选择是直接修改响应上下文标头。这通常在自定义中间件中完成。
类似这样的:
app.Use(async (context, next) =>
{
await next();
context.Response.Headers["headerName"] = "headerValue";
});
不幸的是,它变得有点棘手。响应正文写完后,即使没有传给服务器,也不能修改响应头。
大多数中间件通过“填充”/“包装”响应主体的流来解决这个问题。
public class ShimmedResponseContext
{
public HttpContext _httpContext { get; }
private Stream _originalResponseStream { get; set; }
private MemoryStream _shimmedResponseStream { get; set; }
public ShimmedResponseContext(HttpContext httpContext)
{
_httpContext = httpContext;
}
public void ShimResponseStream()
{
_originalResponseStream = _httpContext.Response.Body;
_shimmedResponseStream = new MemoryStream();
_httpContext.Response.Body = _shimmedResponseStream;
}
public void UnshimResponseStream()
{
_shimmedResponseStream.Position = 0;
_shimmedResponseStream.CopyTo(_originalResponseStream);
_httpContext.Response.Body = _originalResponseStream;
}
}
app.Use(async (context, next) =>
{
var shimmedContext = new ShimmedResponseContext(context);
shimmedContext.ShimResponseStream();
await next();
context.Response.Headers[HeaderNames.CacheControl] = "public,expires=[your chosen date/time]";
shimmedContext.UnshimResponseStream();
});
另外,请确保在 app.UseMVC(); 之前注册此中间件;在您的 Startup.cs 配置方法中,因为中间件按顺序运行并且只有以前注册的中间件才能在稍后的中间件编写响应后劫持响应。