我有一个简单的 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.
}
但是当然,这永远不会受到打击。
有人可以帮忙吗?
依靠 ETag 始终与服务器进行检查要求响应标头包含具有值
Cache-Control
的 no-cache
标头。