Как мне сгенерировать http ETag в c #? - PullRequest
9 голосов
/ 13 октября 2011

Учитывая, что файл возвращается как часть http-запроса.Как правильно создать ETag для этого файла?

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

Я видел, как это делалось несколькими способами

Ответы [ 2 ]

13 голосов
/ 13 октября 2011

Ответ в том, что это зависит.

Существует два вида этагов: слабый и сильный.Слабые позволяют вам выполнять определенные условные операции, но для большинства из них требуются сильные etags.

Единственное ограничение для сильного etag состоит в том, что если представление изменяется по какой-либо причине, то и etag изменяется.Если это файл, вы можете генерировать хеш, но это заставляет вас сохранять сущность в памяти, пока вы ее генерируете.В качестве альтернативы, вы можете просто передать содержимое и добавить Etag в качестве завершающего HTTP-заголовка, но в настоящее время практически ни один сервер не поддерживает эту (очень полезную и нелюбимую) часть функциональности.

Тики имеют низкое разрешение, и этоВозможно, что две последовательные записи в одном и том же файле будут иметь одинаковое количество тактов, даже если содержимое различно.На этом этапе etag теперь недействителен, если он был сильным, а вы в мутной воде.Та же проблема, что и с Last-Modified действительно.Большинство HTTP-серверов имеют дело с этим, чтобы дать файлу etag, основанный на нескольких его свойствах, таких как временная метка, размер и, возможно, идентификатор объекта файла (inode в apache, возможно, добавление полного пути к записи хранилища объектов в NT, иIIS также добавляет счетчик к этому значению, поэтому два изменения конфигурации на сервере будут генерировать разные etags, если что-то изменится).

Если вы используете какую-либо базу данных, версия id + должна быть сильной etag(при условии, что контент, который вы имеете, не является совокупностью нескольких вещей, каждая из которых может изменяться независимо друг от друга и без версии с изменяющимся корнем).

Так как его вычисление действительно зависит от вашего сценария и сохраненияхеш файла при записи (перед началом обслуживания), вероятно, поможет вам больше всего, тем более что это очень полезная функция по многим другим причинам.

8 голосов
/ 13 октября 2011

Семантически ETag должен меняться при изменении содержимого:

Таким образом, Hash кажется подходящим ... но ETag также должен быть уникальным для разных URL-адресов и / или разных временных отметок дубликатов файлов ...на всякий случай хэшируйте файл, соединяйте его с отметкой времени последней модификации, а также с URL и хешем снова ...

...