2011-10-13 34 views
8

給定一個文件作爲http請求的一部分返回。爲該文件創建ETag的正確方法是什麼?如何在c#中生成http ETag?

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

我已經看到它有多種方式

+2

語義上ETag在內容更改時應該更改...所以哈希似乎是合適的...但是ETag必須在不同的URL和/或重複文件的不同時間戳上是唯一的......所以要安全地對文件進行散列,並與時間戳和url以及散列連接起來...... – Yahia

+0

@Yahia你應該做出這個評論回答 – Simon

+0

現在做了:-) – Yahia

回答

12

答案的哈希值是它依賴。

Etags有兩種,弱和強的。弱者讓你做某些有條件的操作,但其中大多數需要強大的etags。

強etag的唯一限制是,如果表示出於任何原因而改變,那麼etag也是如此。如果它是一個文件,你可以生成一個散列,但是這會迫使你在生成時將這個實體保存在內存中。或者,您可以簡單地流式傳輸內容並將Etag添加爲尾隨的HTTP標頭,但幾乎沒有服務器當前支持該功能(非常有用且不受歡迎)。

刻度具有較低的分辨率,即使內容不同,可能同一文件上的兩個連續寫入會具有相同數量的刻度。在那個階段,etag現在是無效的,如果它強壯並且你在渾水中。真正與Last-Modified一樣的問題。大多數HTTP服務器處理的方式是給文件一個etag,它基於它的多個屬性,又名時間戳,大小和可能的文件對象ID(apache中的inode,可能在NT上添加對象存儲條目的完整路徑,以及IIS也會爲該值添加一個計數器,因此如果更改了某個服務器上的兩個配置更改,則會生成不同的etags)。

如果你使用某種類型的數據庫,那麼id +版本應該是一個強大的etag(再次提供,你所擁有的內容不是多個東西的集合,每個東西都可以獨立更改, )。

那麼如何計算它真的取決於你的場景,並且在寫入之前堅持寫文件(在開始服務之前)對你最有幫助,尤其是因爲這是一個非常有用的功能,因爲其他許多原因。

所以哈希似乎是恰當的......但ETag的,還必須對不同的URL和/或重複的文件不同的時間戳獨特的...所以是:

8

語義上ETag的應該當內容的變化而變化在安全的一面散列文件,將其與最後一次修改的時間戳以及url和哈希再次連接...