ASP.NET Core 8 TypedResults.File with ETag 始终从浏览器磁盘缓存返回结果

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

我有一个简单的 ASP.NET Core 8 端点,它返回带有 ETag 的

TypedResults.File
。当我第一次到达端点时,文件返回 100% 正常。

第二次(及后续)我到达端点时使用相同的浏览器实例我得到一个 HTTP 200 OK(来自磁盘缓存) - 它永远不会向我的本地主机服务器发出实际请求。

这是 2x 请求的网络流量:

要求1:

请求 2(从磁盘缓存中获取)

有人可以帮助我吗?我认为,如果初始请求返回 ETag,那么浏览器就“足够聪明”,可以使用 ETag +“If-None-Match”请求标头执行后续请求?

这是生成文件的代码

var etag = new EntityTagHeaderValue($"\"{invoicePdfVersion}-{lastModifiedOn.Ticks}\"");

return TypedResults.File(
    pdfData, // byte array of pdf data 
    "application/pdf", // content type
    "testing", // filename
    false, // enable range processing
    lastModifiedOn, // DateTime when the file was last updated/modified
    etag); // etag value

我知道我可以将此添加到回复中:

context.Response.Headers.CacheControl = "no-cache";

我认为这确实会阻止磁盘缓存的发生,但我不确定这是否是必需的? ReturnTypes.File 的 MS 代码是否应该正确设置所有标头,这样我就不需要执行任何其他操作?

我有一些服务器端代码可以检查 ETag 顺便说一句...

if (context.Request.Headers.TryGetValue(HeaderNames.IfNoneMatch, out var ifNoneMatch) &&
    ifNoneMatch == etag.ToString())
{
    return TypedResults.StatusCode(304); // HTTP NotModified.
}

但是当然,这永远不会受到打击。

有人可以帮忙吗?

c# .net etag
1个回答
0
投票

依靠 ETag 始终与服务器进行检查要求响应标头包含具有值

Cache-Control
no-cache
标头。

© www.soinside.com 2019 - 2024. All rights reserved.