我有一个提供用户头像的端点。如果未设置,它会为其名称生成一个 Identicon。如果他们确实有一套,则会返回该头像。
现在我正在使用
[ResponseCache]
属性来缓存此端点。相反,我只想缓存端点(如果它们有头像集)。
问题是用户没有头像,他们去设置一个头像,但它不会在网站上更新,因为它缓存在浏览器中。
有没有办法将其移至操作中并使其成为有条件的?
[HttpGet("~/fetch-avatar")]
[ResponseCache(Duration = int.MaxValue)]
public async Task<IActionResult> GetAvatar(long userId, ResizeMode mode = ResizeMode.Pad, int width = 0, int height = 0, string downloadName = "") {
var user = await userAppService.GetUserById(userId);
var startChar = user.Slug.ToLower().ToCharArray()[0];
var color = System.Drawing.Color.White;
if (startChar >= 'a' && startChar < 'e') {
color = System.Drawing.Color.Red;
} else if (startChar >= 'e' && startChar < 'j') {
color = System.Drawing.Color.Blue;
} else if (startChar >= 'j' && startChar < 'n') {
color = System.Drawing.Color.Green;
} else if (startChar >= 'n' && startChar < 'r') {
color = System.Drawing.Color.Pink;
} else if (startChar >= 'r' && startChar < 'v') {
color = System.Drawing.Color.Yellow;
} else if (startChar >= 'v' && startChar < 'z') {
color = System.Drawing.Color.Orange;
}
if (string.IsNullOrEmpty(user.Avatar)) {
var g = new IdenticonGenerator()
.WithAlgorithm("SHA256")
.WithBlockGenerators(IdenticonGenerator.ExtendedBlockGeneratorsConfig)
.WithBackgroundColor(color);
var avatar = g.Create(user.Slug);
using (var stream = new MemoryStream()) {
avatar.Save(stream, ImageFormat.Png);
return File(stream.ToArray(), "image/png");
}
}
try {
return await FetchImage(user.Avatar, mode, width, height);
} catch {
var g = new IdenticonGenerator()
.WithAlgorithm("SHA256")
.WithBlockGenerators(IdenticonGenerator.ExtendedBlockGeneratorsConfig)
.WithBackgroundColor(color);
var avatar = g.Create(user.Slug);
using (var stream = new MemoryStream()) {
avatar.Save(stream, ImageFormat.Png);
return File(stream.ToArray(), "image/png");
}
}
}
只需更改响应头即可不存储缓存:
[HttpGet("~/fetch-avatar")]
[ResponseCache(Duration = int.MaxValue)]
public async Task<IActionResult> GetAvatar(long userId, ResizeMode mode = ResizeMode.Pad, int width = 0, int height = 0, string downloadName = "") {
var user = await userAppService.GetUserById(userId);
// ...
if (string.IsNullOrEmpty(user.Avatar)) {
// ...
Response.Headers["Cache-Control"] = "no-store";
}
}