在http1.1規範中,新增了乙個http頭資訊:etag。對web開發者來說,它是乙個非常重要的資訊。它是用作快取使
用的兩個主要的
頭資訊之一 (另乙個是expires)。除此之外,在rest架構中,它還可以用於控制併發操作(上節中已經大
致介紹atompub中控
制併發的流
程)。那麼etag是什麼?它又幾種型別?強etag與弱etag之間有什麼區別。?
如何計算
etag值?它與last-modified頭
資訊在使用上有什
麼區別?
本節主要圍繞這幾個方面敘述一下自己的理解。
目錄:
什麼是etag?
計算etag值
etag的型別以及他們之間的區別
etag與last-modified頭資訊用途上的區別
什麼是etag?
etag:是實體標籤(entity tag)的縮寫。etag一般不以明文形式相應給客戶端。在資源的各個生命週期中,它都具有不
同的值,用
於標識出資源的狀態。當資源發生變更時,如果其頭資訊中乙個或者多個發生變化,或者訊息實體發生變化
,那麼etag也隨之發生變化。
etag值的變更說明資源狀態已經被修改。往往可以通過時間戳就可以便宜的得到etag頭資訊。在服
務端中如果發回給
消費者的相應
從一開始起就由etag控制,那麼可以確保更細粒度的etag公升級完全由服務來進行控制。服務
計算etag值,
並在相應客戶端請求時將
它返回給客戶端。
計算etag值
在http1.1協議中並沒有規範如何計算etag。etag值可以是唯一標識資源的任何東西,如持久化儲存中的某個資源關聯
的版本、乙個或
者多個檔案屬性,實體頭資訊和校
驗值、(checksum),也可以計算實體資訊的雜湊值。有時候,為了計
算乙個etag
值可能有比
較大的代價,此時可以採用生成
唯一值等方式(如
常見的guid)。無論怎樣,服務都應該盡可能的
將etag值返回給客
戶端。客戶端不
用關心etag值如何產生,只要服務在資源狀態發生變
更的情況下將etag值傳送給它就行
。下圖為msdn中,
outgoingresponse類
中設定etag值的截圖:
從上圖可以看出,在rest架構下,etag值可以通過guid、整數、長整形、字串四種型別的引數傳入setetag方法,
wcf服
務發回給
客戶端的http響應頭中就包含了etag值。另外outgoingresponse類也有字串屬性:etag直接給
它賦值也能在
http響應頭中寫入
etag值。
如下所示為使用檔案屬性計算etag:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public
class
etag : iheader
#region iheader 成員
獲取etag:
1
etag etag =
new
etag(fileinfo.name+fileinfo.lastwritetimeutc.tostring())
計算etag值時,需要考慮兩個問題:計算與儲存。如果乙個etag值只需要很小的代價以及占用很低的儲存空間,那麼
我們可以在每次
需要傳送給客戶端etag值值的時候計算一遍就行行了。相反的,我們需要將之前就已經計算並儲存好
的etag值
傳送給客戶端。之前
說:將時間戳作為字串作為一種廉價的方式來獲取etag值。對於不是經常變化的訊息,
它是一種足
夠好的方
案。注意:如果將時間戳
做為etag值,通常不應該用last-modified的值。由於http機制中,所
以當我們在通過
服務校驗資源
狀態時,客戶端不需要進行相應的
改動。計算etag值開銷最大的一般是計算採用雜湊演算法
獲取資源的表述值。
可以只計算資源
的雜湊值,也可以將頭資訊和頭資訊的值也
包含進去。如果包含頭資訊,那麼注意
不要包含計算機標識的
頭資訊。同樣也應該避
免包含expires、cache-control和vary頭資訊。注
意:在通過雜湊演算法
計算etag值時,先要組裝資
源的表述。若組裝也比較耗時
,可以採用生成guid的方式。優化etag值的獲取。
etag有兩種型別現將�etag(strong etag)與弱etag(weak etag)。
強etag表示形式:"22faa065-2664-4197-9c5e-c92ea03d0a16"。
弱etag表現形式:w/"22faa065-2664-4197-9c5e-c92ea03d0a16"。
強、弱etag型別的出現
與apache
伺服器計算etag的方式有關。apache預設通過fileetag中fileetag inode mtime siz
e的配置自動生成etag
(當然也可以通過使用者自
定義的方式)。假設服務端的資源頻繁被修改(如1秒內修改了n次),此時
如果有使用者將apache
的配置改為mtime,由於mtime只能精
確到秒,那麼就可以避免強etag在1秒內的etag總是不同而
頻繁重新整理cache
(如果資源在
秒級經常被修改,也可以通過last-modified
來解決)。
etag與last-modified頭資訊用途上的區別
按照http標準,last-modified只能精確到秒級。etag的出現可以很好的解決這個問題。在用途上,etag常與
if-none-match或者
if-match一起,由客戶端通過http頭資訊(包括etag值)傳送給服務端處理。etag使用如下:
或if-none-match:"22faa065-2664-4197-9c5e-c92ea03d0a16"
last-modified常與if-modified-since一起由客戶端將last-modified值包括在http頭資訊中發給服務端進行處理。
其使用如下:
if-modified-since:sat,24 dec 2011 11:55:36 gmt
你知道HTTP協議的ETag是幹什麼的嗎?
在http1.1規範中,新增了乙個http頭資訊 etag。對於普通開發者來說,可能平時真的不會接觸到該http頭。平時接觸不到或者說用得少,不代表這個請求頭不重要。etag使用得當,是可以減少伺服器頻寬壓力的。etag是 entity tag的縮寫,可以理解為 被請求變數的實體值 etag是服務端...
你知道HTTP協議的ETag是幹什麼的嗎?
在http1.1規範中,新增了乙個http頭資訊 etag。對於普通開發者來說,可能平時真的不會接觸到該http頭。平時接觸不到或者說用得少,不代表這個請求頭不重要。etag使用得當,是可以減少伺服器頻寬壓力的。etag是 entity tag的縮寫,可以理解為 被請求變數的實體值 etag是服務端...
你應該知道git rebase
多人開發時,一般都會使用git來進行 管理。使用過git的童鞋肯定對git pullgit pushgit merge非常熟悉。那麼,大家有沒有了解過git rebase命令呢?rebase翻譯成中文叫 變基 相比merge,rebase並沒有進行合併操作,該命令只是提取了當前分支的修改,將其複製在...