【问题标题】:ASP.NET Core Web API Response caching with expiration header带有过期标头的 ASP.NET Core Web API 响应缓存
【发布时间】:2017-08-30 12:46:45
【问题描述】:

我想缓存我的 web api 的响应直到一个特定的时间,而不是一个特定的时间。为此,我想使用某种到期标头。截至目前,我在我的操作中使用带有“ResponseCache”属性的“Microsoft.AspNetCore.ResponseCaching”包,如下所示:

[ResponseCache(Duration = 50)]

之所以要使用过期,是因为api只提供了GET方法,数据是静态的(每天刷新一次)。有没有可能实现这样的东西?:

[ResponseCache(Expires = 00:00AM)]

【问题讨论】:

    标签: asp.net-core asp.net-core-webapi


    【解决方案1】:

    不幸的是 .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 配置方法中,因为中间件按顺序运行并且只有以前注册的中间件才能在稍后的中间件编写响应后劫持响应。

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2017-01-23
      • 2016-05-05
      • 2014-03-21
      • 2018-06-05
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多