【发布时间】:2021-11-24 16:38:10
【问题描述】:
我们有多租户应用程序,现在客户希望每个租户都有自己的徽标,可从管理应用程序上传。现在为了不每次打开应用程序时都下载图像,我会告诉浏览器缓存它。
现在的问题是,当有新的 logo 上传时,如何通过 API 告诉浏览器? 我会将上传日期保存在数据库中,但是如何使用它以便浏览器在需要时下载新图像?或者我需要一些我可以使用的其他信息?
【问题讨论】:
标签: c# asp.net-core asp.net-core-webapi
我们有多租户应用程序,现在客户希望每个租户都有自己的徽标,可从管理应用程序上传。现在为了不每次打开应用程序时都下载图像,我会告诉浏览器缓存它。
现在的问题是,当有新的 logo 上传时,如何通过 API 告诉浏览器? 我会将上传日期保存在数据库中,但是如何使用它以便浏览器在需要时下载新图像?或者我需要一些我可以使用的其他信息?
【问题讨论】:
标签: c# asp.net-core asp.net-core-webapi
你可以这样做:
[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 标头中发送此值。
注意:请确保在比较日期时使用正确的时区。
【讨论】: