ASPNet Core 有条件设置响应缓存

问题描述 投票:0回答:1

我有一个提供用户头像的端点。如果未设置,它会为其名称生成一个 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");
            }
        }
    }
c# asp.net-core
1个回答
0
投票

只需更改响应头即可不存储缓存:

[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";
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.