ASP.NET MVC如何使用輸出緩存
阿新 • • 發佈:2018-07-24
apt ase 沒有 display src 機制 location database asa 通過這篇文章你將學習到在MVC中如何使用輸出緩存,業務邏輯我就不多介紹了,主要是Outputcache的基本使用。至於數據緩存還是等我的下一篇文章吧,一步一步來不急的。
輸出緩存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我這裏以Action為示例
在20秒時間差距內頁面上的時間都不會被改變。他在Response Header中過期時間和上次修改的時間正好相隔20秒。Http StatusCode 304 這個我得簡單介紹下,這個頁面是緩存在客戶端瀏覽器的,服務器在接收響應時(還沒有超過20秒)並沒有返回給瀏覽器一個新的html文檔,只是告訴瀏覽器 No Modified,從本地去讀取即可。當然有必要去了解一下304 ,介紹看看這篇文章http狀態碼304的介紹
在Controller上加OutputCache特性時,Controller下的所有的Action都將實現此特性。如果同時Action也有此特性時,以Action為標準,Action的粒度更精細。 Outputcache特性中可以加上一些參數,主要有這些
對於這些參數如何使用我就寫幾個例子,看看效果吧。
還是200 ,所以只用VarByParam參數這種緩存是沒有做到緩存數據的更新,這我就納悶了。知道的可以告訴我一下。 但是如果只是設置一個參數的,當參數值發生變化時,緩存也發生變化。設置多個參數時直接用*表示,也是有緩存數據的更新的。
[OutputCache(Duration =20)]//設置過期時間為20秒 public ActionResult ExampleCache() { var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH時mm分ss秒"); ViewBag.timeStr我們在頁面上可以很明顯地看到:= timeStr; return View(); }
在20秒時間差距內頁面上的時間都不會被改變。他在Response Header中過期時間和上次修改的時間正好相隔20秒。Http StatusCode 304 這個我得簡單介紹下,這個頁面是緩存在客戶端瀏覽器的,服務器在接收響應時(還沒有超過20秒)並沒有返回給瀏覽器一個新的html文檔,只是告訴瀏覽器 No Modified,從本地去讀取即可。當然有必要去了解一下304 ,介紹看看這篇文章http狀態碼304的介紹
在Controller上加OutputCache特性時,Controller下的所有的Action都將實現此特性。如果同時Action也有此特性時,以Action為標準,Action的粒度更精細。 Outputcache特性中可以加上一些參數,主要有這些
int Durrtion | 獲取或設置緩存持續時間(以秒為單位) |
bool NoStore | 是否存儲緩存,默認是false,當為true時http狀態碼就會變成200 |
string VaryByParam | 獲取或設置參數變化的值。不同的參數都會被緩存不同的文檔,多個參數用逗號隔開,none、*(空、所有) |
string CacheProfile | 獲取或設置緩存配置文件名稱,也就是說在配置文件中設置緩存 |
string VaryByCustom | 獲取或設置基於自定義項變化的值,自定義任何輸出緩存的文字,比較常用 |
Location | 枚舉值 None不緩存,Server緩存在服務器端,Client緩存在瀏覽器,Any在瀏覽器、代理服務器、web服務器 |
string sqlDependency | 獲取或設置 SQL 依賴項,根據數據庫的變化更新緩存 |
1.輸出緩存CacheProfile使用配置文件設置緩存
這種方式便於統一配置,當然也可以設置參數duration、location 、varybyparam等。我們需要在system.web 節點下加入這些<!---CacheProfile配置文件中設置緩存--> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/> </outputCacheProfiles> </outputCacheSettings> </caching> <!---CacheProfile配置文件中設置緩存end-->其實作用和效果還是一樣,無非就是方便點,統一的配置參數都直接寫webconfig文件裏面。當然你也可以在Controller中寫。看效果吧
2.輸出緩存VarByParam參數的使用
簡單點來說就是根據不同的參數值生成緩存。代碼是這樣的[OutputCache(Duration =20,VaryByParam ="type,page")] public ActionResult ExampleVaryByParam(string type,int page) { ViewBag.type = type; ViewBag.page= page; return View(); }通過頁面上可以觀察到,這是不符合緩存數據的更新的,在緩存持續的時間內,改變了參數值,但是Action並沒有重新生成頁面返回,但是瀏覽器的Http Status Code
還是200 ,所以只用VarByParam參數這種緩存是沒有做到緩存數據的更新,這我就納悶了。知道的可以告訴我一下。 但是如果只是設置一個參數的,當參數值發生變化時,緩存也發生變化。設置多個參數時直接用*表示,也是有緩存數據的更新的。
3.輸出緩存VarByCustom參數的使用
輸出緩存中VarBuCustome參數的主要作用是根據數據改變讓客戶端緩存過期並及時更新。 主要用於自定義輸出緩存要求的任意文本。如果賦值該屬性值是browser,緩存將隨瀏覽器名稱和主要版本信息的不同而異。如果輸入了自定義的字符串,則必須在應用程序的Global.asax文件中重寫 Httpapplication GetVaryByCustomString方法。public override string GetVaryByCustomString(HttpContext context, string custom) { //custom 是Outputcache中的參數VaryByCustom參數值 ,VaryByCustome為*代指所有參數 if (custom == "type") { return context.Request.AnonymousID; //返回的這個字符串會與當前Action的緩存比較,字符串不一致則更新緩存。 } return base.GetVaryByCustomString(context, custom); }特性
[OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)] public ActionResult ExampleVaryByCustom(string type) { ViewBag.type = type; return View(); }通過觀察實現的效果很明顯:在緩存持續的時間內,type參數值沒有改變時 status Code 還是304 ,參數值發生改變時則是200重新生成頁面了。 從這個即時更新的緩存來說已經達到要求了,當然這從業務上來說還是不夠的。 可以得出的緩存結果,整個更新緩存的機制是 發現參數值不同便重新生成視圖,就可以做到緩存的更新(當然更深入的緩存機制我也不知道,歡迎批評)
4.輸出緩存SqlDependency的使用
首先我們還是來學習一下如何啟用數據庫緩存依賴項。
運行cmd命令: cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
運行相關命令: aspnet_regsql -S . -U sa -P 123456 -ed -d 數據庫名 -et -t 表名
解釋一下
註冊:aspnet_regsql -S . -E -ed -d 數據庫名 -et -t 表名 刪除:aspnet_regsql -S . -E -d 數據庫名 -dt -t 表名 取消數據庫緩存依賴: aspnet_regsql -S . -E -dd 數據庫名數據庫名 列出已註冊表:aspnet_regsql -S . -E -d 數據庫名 -lt
如圖:
現在我們已經開啟數據庫的緩存依賴,我們繼續在webconfig這樣配置。<!---CacheProfile配置文件中設置緩存--> <caching> <!--緩存的數據庫依賴--> <sqlCacheDependency> <databases> <add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/> <!--name:配置sqlDependency會用到,connectionStringName:數據庫連接字符串的名稱,pollTime:監聽數據庫變化的間隔時間,以毫秒為單位。即每隔1秒鐘去監聽數據庫中的表Product是否有變化--> </databases> </sqlCacheDependency> <outputCacheSettings> <outputCacheProfiles> <!--<add name="exampleCacheProfile" duration="100" location="Any" enabled="true"/>--> <add name="exampleSqlDependency" duration="20" location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/> <!--sqlDenpendency:數據依賴節點名稱+冒號+數據庫表名(區分大小寫)--> </outputCacheProfiles> </outputCacheSettings> </caching> <!---CacheProfile配置文件中設置緩存end-->
當然還有數據庫連接字符串,還是貼出來吧
<code class="language-html"> <connectionStrings> <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providerName="System.Data.SqlClient" />--> <add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/> </connectionStrings>
為了看到效果可以在在視圖中加個時間
[OutputCache(CacheProfile = "exampleSqlDependency")] public ActionResult ExampleSqlDependency() { ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH時mm分ss秒"); return View(); }
所實現的效果是:數據庫的Product表數據沒有任何變化時,20秒的緩存持續時間內,這個時間是不會變化的,也就是從瀏覽器緩存中去讀取http Status Code 為304。
當Product有數據變化時,這個時間刷新成當前時間,也就是Action從新生成了Html文檔返回給瀏覽器。
5.總結
輸出緩存在實際的應用中還是需要自己去體會。在業務邏輯的處理中才更能體會到緩存的重要性。當然數據緩存也很重要,應用非常廣泛,所以還是有必要去掌握。寫的不足的地方希望給個評論指點一二。
ASP.NET MVC如何使用輸出緩存