1經過vs裏面帶的命令提示窗口。javascript
2或者.NET Framework 版本 4(64 位系統)條件,%windir%\Microsoft.NET\Framework64\v4.0.30319目錄下找到aspnet_regsql.exe, 執行下面cmd命令java
aspnet_regsql -S .\LK -E -ed -d CommunicationPlatformByLK -et -t UserInfor
-S 服務器,-E windows認證方式 -ed -d緩存的數據庫 -et -t緩存的數據表。web
若是你想查爲起的緩存表起名,或者改變認證方式等要求,查一查。畢竟我們作的是例子。sql
這樣命令以後,在緩存的數據庫中會創建一個數據表,具備觸發功能。數據庫
配置文件:注意第一個鏈接節點是EF幫咱們生成的,用這個是不行的,第二個是我手動加上的,用這個才行。因此用ef或者其餘的朋友注意這點。windows
<connectionStrings>
<add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=LIKE-PC\LK;initial catalog=CommunicationPlatformByLK;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="CommunicationPlatformByLK" connectionString="data source=.\LK;Integrated Security=SSPI;
initial catalog=CommunicationPlatformByLK;" />
</connectionStrings>
system.web> <caching> <sqlCacheDependency enabled="true" > <databases> <add name="Test" connectionStringName="CommunicationPlatformByLK" pollTime="500" />
//name隨便起,後面的connectStringName是新添加鏈接字符串的鍵名,500以ms爲單位,採用的輪詢機制,程勳每0.5s問檢測數據庫是否發上變化 </databases> </sqlCacheDependency> </caching>
記得SqlDependency裏面的值是,配置文件的值=name:起緩存的數據表名瀏覽器
[OutputCache(Duration = 60, SqlDependency = "Test:UserInfor",Location=System.Web.UI.OutputCacheLocation.ServerAndClient)]
public ActionResult GetAllUserInfos()
{
int pageIndex = int.Parse(Request["page"]);
int pageSize = int.Parse(Request["rows"]);
int rowcount = 0;
IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out rowcount);
var result = new { total = rowcount, rows = pageEntityList };
return Json(result, JsonRequestBehavior.AllowGet);
}
注意:理解:既然有的polltime,爲何打的標籤還有duration參數。緩存
答案:在duration時間內,只要數據庫表沒有變化,會一直讀取服務器緩存(不會執行action方法體),可是隻要數據庫發生變化,而且保證polltime已經到了,duration時間就不起做用了。服務器
因此咱們通常蛇者polltime很小,設置duration很長。ide
有人說duration沒什麼用,去掉不行嗎?答案是不行的~~由於duration是必須的參數。雖然沒什麼主要用途。
前臺讀取客戶端緩存,用get,非post。由於get請求方式參數不變的狀況下,默認會讀取瀏覽器緩存。但post方式不會如此。
OutputCache的參數有默認值,location默認客戶端和服務端都有,varyby..默認根據參數。
VaryByHeader = "User-Agent"換瀏覽器讀取數據庫,VaryByParam = "a"隨便定義一個參數,就防止隨着參數值變化而變化。
google顯示正確,讀取客戶端緩存,可是ie firefox並無。可是服務器緩存都是正常讀取的。
讀取服務器緩存本質:(當第一次請求執行一個action,會執行裏面的方法體,在duration時間內,屢次請求這個action,再也不執行裏面的方法體,而直接從服務器端的緩存發來)
在controller或者action上面寫上[OutputCache(Duration=20....)],由於controller有不少action,若是單在controller上面寫,全部action都會創建對應的頁面的緩存,並必定適用,因此通常用到哪個action,就在上面打上此標籤即可。
那實際開發中的項目寫一個例子。
action
1 [OutputCache(Duration = 60)]
2 public ActionResult GetAllUserInfos()
3 {
4 int pageIndex = int.Parse(Request["page"]);
5 int pageSize = int.Parse(Request["rows"]);
6 int rowcount = 0;
7 IQueryable<UserInfor> pageEntityList = userInforService.SelectPageEntityList<int>(u => u.ID, u => u.ID > 0, pageIndex, pageSize, false, out rowcount);
8 var result = new { total = rowcount, rows = pageEntityList };
9 return Json(result, JsonRequestBehavior.AllowGet);
10 }
前臺easyui:注意必定是get方式,非post方式。由於get請求方式參數不變的狀況下,默認會讀取瀏覽器緩存。但post方式不會如此。
function initGrid() {
$('#tt').datagrid({
url: '/UserInfor/GetAllUserInfos',
title: '演示表格使用',
width: 900,
method:'get',
height: 400,
//*****省略
google response
IE
IE response
IE 響應正文
google顯示304而ie顯示200,其他cache-control 都有max-age(服務器的剩餘緩存時間),都有從數據庫的緩存中返回數據。
肯定的是,ie和google都在duration時間內,action的代碼不會被執行。google返回304,讀取了客戶端緩存,可是服務器緩存返回了數據。
ie返回200,沒有讀取客戶端緩存(是沒在客戶端造成緩存嗎?)。也返回了服務器緩存。
按照網上資料,在action中添加Response.Cache.SetOmitVaryStar(true);,最終結果沒卵用。有毛病這是.
google變成了200,可是action代碼在duration時間內不會執行裏面方法體。也返回了數據。可是max-age一直是服務器的緩存時間,木有減小等變化。
ie
ie也是200,也返回了服務器緩存數據,action方法體沒執行,沒有讀取客戶端緩存(仍是沒有建立客戶端緩存?)
就將就依靠服務器緩存來作緩存吧。