ASP.NET Web API中通過ETag實現快取

Darren Ji發表於2016-01-19

 

通常情況下Server是無狀態的,在ASP.NET Web API中,我們可以讓服務端響應體中產生ETag屬性,起到快取的作用。大致實現原理是:

1、服務端的響應體中返回一個ETag屬性
2、客戶端通過If-None-Match屬性把ETag的屬性值傳遞給服務端
3、服務端返回304狀態碼

響應體中返回ETag屬性

安裝CacheCow.Server

在WebApiConfig.cs中配置:

using CacheCow.Server;

var cacheHandler = new CachingHandler();
config.MessageHandlers.Add(cacheHandler);

此時,在客戶端發出請求:

User-Agent:Fiddler
Host:localhost:8901

在返回的訊息中存在一個ETag屬性。

ETag:W/"..."

通常情況下,伺服器重啟或IIS重啟都會影響ETag的值。

此時,再把ETag放到請求體中:

User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."

服務端返回304 Not Found.意味著自從Entity被建立後未曾被改變過。

響應體中返回ETag, LastModified屬性

var cacheHandler = new CachingHandler();
cacheHandler.AddLastModifiedHeader = false;//預設為true
config.MessageHandlers.Add(cacheHandler);

此時,在客戶端發出請求:

User-Agent:Fiddler
Host:localhost:8901

在返回的訊息中存在一個ETag屬性。

ETag:W/"..."

此時,再把ETag放到請求體中:

User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."

服務端返回304 Not Found.並且有Last-Modified屬性,表示上次修改的時間。

響應體中返回與Sql Server相關的ETag屬性

安裝CacheCow.Server.EntityTagStore.SqlServer

var connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
var etagStore = new SqlServerEntityTagStore(connString);
var cacheHandler = new CacheHandler(etagStore);
config.MessageHandlers.Add(cacheHandler);

還要在Sql Server上加一個儲存過程。

→開啟專案所在資料夾
→packages資料夾
→CacheCow.Server.EntityTagStore.SqlServer.0.4.1資料夾
→scripts下的script.sql檔案,複製其中的語句,在Sql Server上建立對應的表和儲存過程。

此時,在客戶端發出請求:

User-Agent:Fiddler
Host:localhost:8901

在返回的訊息中存在一個ETag屬性。

ETag:"..."

但此時ETag的屬性值沒有以"W/"開頭。

此時,再把ETag放到請求體中:

User-Agent:Fiddler
Host:localhost:8901
If-None-Match:"..."

服務端返回304 Not Found.意味著自從Entity被建立後未曾被改變過。

 

相關文章