2011-10-13 8 views
8

Dato un file che viene restituito come parte di una richiesta http. Qual è il metodo corretto per creare un ETag per quel file?Come si genera un ETag http in C#?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

ho visto fare in diversi modi

+2

semanticamente l'ETag dovrebbe cambiare quando il contenuto cambia ... quindi l'hash sembra appropriato ... ma l'ETag deve anche essere univoco su diversi URL e/o timestamp diversi di file duplicati ... quindi per essere sicuri hash il file, concatenarlo con il timestamp e l'url e l'hash che ancora ... – Yahia

+0

@ Yahia dovresti rendere questo commento una risposta – Simon

+0

fatto proprio ora :-) – Yahia

risposta

12

La risposta è che dipende.

Esistono due tipi di tag Etags, deboli e forti. I più deboli ti permettono di eseguire determinate operazioni condizionali, ma la maggior parte di esse richiederà forti attacchi di stato.

L'unica restrizione su un etag forte è che se la rappresentazione cambia per qualsiasi motivo, così fa l'etag. Se si tratta di un file, puoi generare un hash, ma ciò ti obbliga a mantenere l'entità in memoria mentre la generi. In alternativa, è possibile semplicemente eseguire lo streaming del contenuto e aggiungere Etag come intestazione HTTP finale, ma quasi nessun server attualmente supporta tale funzionalità (molto utile e non).

Le zecche hanno una risoluzione bassa ed è possibile che due scritture contigue sullo stesso file abbiano lo stesso numero di zecche, anche se il contenuto è diverso. A quel punto, l'etag non è più valido se è forte e sei in acqua fangosa. Lo stesso problema con Last-Modified davvero. Il modo in cui la maggior parte dei server HTTP si occupa di fornire un file è un etag basato su più proprietà, pseudonimo, dimensioni e probabilmente ID oggetto file (inode in apache, probabilmente aggiungendo il percorso completo alla voce dell'archivio oggetti su NT, e IIS aggiunge un contatore anche a questo valore, quindi due modifiche di configurazione su un server genererebbero etags diversi, nel caso in cui qualcosa cambi).

Se si utilizza una sorta di database, la versione id + dovrebbe essere un forte etag (a patto che, di nuovo, il contenuto non sia un insieme di più cose che ciascuna potrebbe cambiare indipendentemente senza che anche le versioni di modifica delle radici).

Quindi, come calcolarlo dipende molto dal tuo scenario, e il persistere di un hash del file in scrittura (prima di iniziare la pubblicazione) probabilmente ti aiuterà di più, specialmente perché è una funzionalità molto utile per molti altri motivi.

8

semanticamente l'ETag dovrebbe cambiare quando cambia il contenuto:

Così il Hash sembra opportuno ... ma l'ETag deve anche essere univoco URL diversi e/o diversi timestamp di file duplicati in modo da essere ... sul lato sicuro hash il file, concatenato che con il timestamp dell'ultima modifica e l'url e hash che ancora ...