Wie erzeuge ich ein http ETag in c #?

8

Gegeben eine Datei, die als Teil einer HTTP-Anfrage zurückgegeben wird. Was ist die korrekte Methode zum Erstellen eines ETag für diese Datei?

Ссылка

Ich habe es auf verschiedene Arten gesehen

  • Verwenden der letzten Schreibzeit der in Ticks konvertierten Datei. Was macht NancyFX Ссылка
  • Einen Hash der Datei verwenden Ссылка
Simon 13.10.2011, 05:13
quelle

2 Antworten

12

Die Antwort ist, dass es abhängt.

Es gibt zwei Arten von Etags, schwache und starke. Die Schwachen erlauben bestimmte bedingte Operationen, aber die meisten erfordern starke Etags.

Die einzige Einschränkung bei einem starken Etag besteht darin, dass sich die Darstellung ändert, wenn sich die Darstellung aus irgendeinem Grund ändert, ebenso die Etag. Wenn es sich um eine Datei handelt, können Sie einen Hash generieren, der Sie jedoch zwingt, die Entität im Speicher zu belassen, während Sie diese generieren. Alternativ können Sie den Inhalt einfach streamen und das Etag als nachgestellten HTTP-Header hinzufügen, aber fast kein Server unterstützt derzeit diese (sehr nützliche und ungeliebte) Funktionalität.

Ticks haben eine niedrige Auflösung, und es ist möglich, dass zwei zusammenhängende Schreibvorgänge in derselben Datei die gleiche Anzahl von Ticks haben, obwohl der Inhalt unterschiedlich ist. In diesem Stadium ist die Etag ungültig, wenn sie stark war und du in schlammigem Wasser bist. Das gleiche Problem wie bei Last-Modified. Die meisten HTTP-Server behandeln eine Datei mit einem Etag, das auf mehreren Eigenschaften basiert, auch bekannt als Zeitstempel, Größe und wahrscheinlich Dateiobjekt-ID (inode in apache, wahrscheinlich der vollständige Pfad zum Objektspeichereintrag auf NT und IIS fügt auch diesem Wert einen Zähler hinzu, so dass zwei Konfigurationsänderungen auf einem Server unterschiedliche Etags generieren würden, falls sich etwas ändert.)

Wenn Sie irgendeine Art von Datenbank verwenden, sollte die ID + -Version ein starkes Etag sein (vorausgesetzt, der Inhalt, den Sie haben, ist nicht eine Ansammlung von mehreren Dingen, die jeder unabhängig ändern kann, auch ohne die Root-Versionen) .

Wie man es berechnet, hängt wirklich von Ihrem Szenario ab, und es wird Ihnen vermutlich am meisten helfen, einen Hash der Datei beim Schreiben (vor dem Servieren) beizubehalten, zumal es aus vielen anderen Gründen sehr nützlich ist / p>     

SerialSeb 13.10.2011, 06:17
quelle
8

Semantisch sollte sich der ETag ändern, wenn sich der Inhalt ändert:

Der Hash scheint also angemessen zu sein ... aber der ETag muss auch bei verschiedenen URLs und / oder verschiedenen Zeitstempeln von doppelten Dateien eindeutig sein ... also um die Datei auf der sicheren Seite zu hacken, verketten Sie diese mit dem Zeitstempel des letzte Änderung und die URL und Hash, die wieder ...

    
Yahia 13.10.2011 08:00
quelle

Tags und Links