ASP.NET Web API中通過ETag實現緩存


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM