【问题标题】:.NET Core API update cached image if newer.NET Core API 更新缓存的图像(如果更新)
【发布时间】:2021-11-24 16:38:10
【问题描述】:

我们有多租户应用程序,现在客户希望每个租户都有自己的徽标,可从管理应用程序上传。现在为了不每次打开应用程序时都下载图像,我会告诉浏览器缓存它。

现在的问题是,当有新的 logo 上传时,如何通过 API 告诉浏览器? 我会将上传日期保存在数据库中,但是如何使用它以便浏览器在需要时下载新图像?或者我需要一些我可以使用的其他信息?

【问题讨论】:

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


    【解决方案1】:

    你可以这样做:

    [HttpGet]
    public IActionResult Logo()
    {
        // Mock value. Get actual upload date from the db here
        DateTime uploadDate = new DateTime(2021, 11, 24, 0, 0, 0, DateTimeKind.Utc); 
    
        if (Request.GetTypedHeaders().IfModifiedSince?.UtcDateTime >= uploadDate)
        {
            return StatusCode(StatusCodes.Status304NotModified);
        }
    
        // Mock value. Get actual image bytes from the db/disk here
        byte[] bytes = new byte[0];
    
        ResponseHeaders responseHeaders = Response.GetTypedHeaders();
        responseHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };
        responseHeaders.LastModified = new DateTimeOffset(uploadDate);
    
        return File(bytes, "image/png");
    }
    

    首先你会得到图片字节和上传日期。然后将If-Modified-Since 标头的值(它将由浏览器自动设置)与上传日期进行比较。如果uploadDate 不早于此值,则表示浏览器缓存已包含最新图像,您可以使用304 Not Modified 进行响应。否则,您将Cache-Control 标头设置为no-cache(这会强制浏览器询问您的API 缓存图像在每个请求中是否仍然有效)并将Last-Modified 标头设置为uploadDate。浏览器将在后续请求中在 If-Modified-Since 标头中发送此值。

    注意:请确保在比较日期时使用正确的时区。

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2016-12-17
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      相关资源
      最近更新 更多