.NET Core API 如果较新则更新缓存图像

.NET Core API update cached image if newer

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

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

你可以这样做:

[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 header 的值(它将由浏览器自动设置)与上传日期进行比较。如果 uploadDate 不早于此值,则表示浏览器缓存已包含 up-to-date 个图像,您可以使用 304 Not Modified 进行响应。否则,您将 Cache-Control header 设置为 no-cache(强制浏览器询问您的 API 缓存图像在每个请求中是否仍然有效)并设置 Last-Modified header 到 uploadDate。浏览器将在后续请求中 If-Modified-Since header 中发送此值。

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