ASP.NET Core 8 TypedResults.File mit ETag, das immer ein Ergebnis aus dem Browser-Festplattencache zurückgibt
Posted: 01 Jan 2025, 22:45
Ich habe einen einfachen ASP.NET Core 8-Endpunkt, der eine TypedResults.File mit einem ETag zurückgibt. Beim ersten Mal, wenn ich den Endpunkt erreiche, wird die Datei zu 100 % in Ordnung zurückgegeben.
Beim zweiten (und folgenden) Mal erreiche ich den Endpunkt mit derselben Instanz des Browsers Ich erhalte ein HTTP 200 OK (vom Festplatten-Cache) – es stellt nie die eigentliche Anfrage an meinen Localhost-Server.
Hier ist der Netzwerkverkehr der 2x Anfragen:
Anfrage 1:

Anfrage 2 (die es aus dem Festplatten-Cache holt)

I dachte, dass, wenn die erste Anfrage ein ETag zurückgibt, der Browser „intelligent genug“ ist, um nachfolgende Anfragen mit dem ETag + „If-None-Match“-Anfrageheader durchzuführen?
Dies ist der Code, der die Datei generiert hat
Ich verstehe, dass ich Folgendes zur Antwort hinzufügen könnte:
Was verhindert meiner Meinung nach das Auftreten des Festplattencaches, bin mir aber nicht sicher, ob dies erforderlich ist? Sollte der MS-Code für ReturnTypes.File nicht alle Header korrekt einrichten, sodass ich nichts weiter tun muss?
Ich habe einen serverseitigen Code, der den ETag überprüft:
Aber das wird natürlich nie getroffen.
Was kann ich als nächstes versuchen?
Beim zweiten (und folgenden) Mal erreiche ich den Endpunkt mit derselben Instanz des Browsers Ich erhalte ein HTTP 200 OK (vom Festplatten-Cache) – es stellt nie die eigentliche Anfrage an meinen Localhost-Server.
Hier ist der Netzwerkverkehr der 2x Anfragen:
Anfrage 1:

Anfrage 2 (die es aus dem Festplatten-Cache holt)
I dachte, dass, wenn die erste Anfrage ein ETag zurückgibt, der Browser „intelligent genug“ ist, um nachfolgende Anfragen mit dem ETag + „If-None-Match“-Anfrageheader durchzuführen?
Dies ist der Code, der die Datei generiert hat
Code: Select all
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
Code: Select all
context.Response.Headers.CacheControl = "no-cache";
Ich habe einen serverseitigen Code, der den ETag überprüft:
Code: Select all
if (context.Request.Headers.TryGetValue(HeaderNames.IfNoneMatch, out var ifNoneMatch) &&
ifNoneMatch == etag.ToString())
{
return TypedResults.StatusCode(304); // HTTP NotModified.
}
Was kann ich als nächstes versuchen?