通常情況下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被建立後未曾被改變過。