ASP.Net緩衝總結及分析 分享

來源:互聯網
上載者:User

1.頁面緩衝 

要實現網頁輸出快取,只要將一條 OutputCache 指令添加到頁面即可。  

<%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False" Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>  

CacheProfile

用於定義與該頁關聯的緩衝設定的名稱。是可選屬性,預設值為空白字元("")。需要注意的是,包含在使用者控制項中的@ OutputCache指令不支援此屬性。在頁面中指定此屬性時,屬性值必須與Web.config檔案<outputCacheSettings>配置節下的outputCacheProfiles元素中的一個可用項的名稱匹配。如果此名稱與設定檔項不匹配,將引發異常。

NoStore

該屬性定義一個布爾值,用於決定是否阻止敏感資訊的二級儲存。需要注意的是,包含在使用者控制項中的@ OutputCache指令不支援此屬性。將此屬性設定為true等效於在請求期間執行代碼“Response.Cache.SetNoStore();”。

Duration

用於設定頁面或者使用者控制項緩衝的時間。單位是秒。通過設定該屬性,能夠為來自對象的HTTP響應建立了一個到期策略,並將自動快取頁面或使用者控制項輸出。需要注意的是,Duration屬性是必需的,否則將會引起分析器錯誤。

Shared

該屬性定義一個布爾值,用於確定使用者控制項輸出是否可以由多個頁共用。預設值為false。注意,包含在ASP.NET頁中的@ OutputCache指令不支援此屬性。

Location

用於指定輸出快取項目的位置。其屬性值是OutputCacheLocation枚舉值,它們是Any、Client、Downstream、None、Server和ServerAndClient。預設值是Any,表示輸出緩衝可用於所有請求,包括用戶端瀏覽器、Proxy 伺服器或處理請求的伺服器上。需要注意的是,包含在使用者控制項中的@ OutputCache指令不支援此屬性。

SqlDependency

該屬性標識一組資料庫/表名稱對的字串值,頁或控制項的輸出緩衝依賴於這些名稱對。需要注意:SqlCacheDependency類監視輸出緩衝所依賴的資料庫中的表,因此,當更新表中的項時,使用基於表的輪詢將從緩衝中移除這些項。當通知(在SQL Server 2005中)與CommandNotification值一起使用時,最終將使用SqlDependency類向SQL Server 2005伺服器註冊查詢通知。另外,SqlDependency屬性的CommandNotification值僅在ASP.NET頁中有效。控制項只能將基於表的輪詢用於@ OutputCache指令。

VaryByControl

該屬性使用一個分號分隔的字串列表來更改使用者控制項的輸出緩衝。這些字串代表在使用者控制項中聲明的ASP.NET伺服器控制項的ID屬性值。除非已經包含了VaryByParam屬性,否則在@ OutputCache指令中,該屬性是必需的。

VaryByCustom

用於自訂輸出緩衝要求的任意文本。如果賦予該屬性值是browser,緩衝將隨瀏覽器名稱和主要版本資訊的不同而異。如果輸入了自訂字串,則必須在應用程式的Global.asax檔案中重寫HttpApplication.GetVaryByCustomString方法。

VaryByHeader

該屬性中包含由分號分隔的HTTP標題列表,用於使輸出緩衝發生變化。當將該屬性設為多標題時,對於每個指定的標題,輸出緩衝都包含一個請求文檔的不同版本。VaryByHeader屬性在所有HTTP 1.1緩衝中啟用快取項目,而不僅限於ASP.NET緩衝。使用者控制項中的@ OutputCache指令不支援此屬性。

VaryByParam

該屬性定義了一個分號分隔的字串列表,用於使輸出緩衝發生變化。預設情況下,這些字串與用GET方法屬性發送的查詢字串值對應,或與用POST方法發送的參數對應。當將該屬性設定為多參數時,對於每個指定的參數,輸出緩衝都包含一個請求文檔的不同版本。可能的值包括“none”、“*”和任何有效查詢字串或POST參數名稱。值得注意的是,在輸出緩衝ASP.NET頁時,該屬性是必需的。它對於使用者控制項也是必需的,除非已經在使用者控制項的@ OutputCache指令中包含了VaryByControl屬性。如果沒有包含,則會發生分析器錯誤。如果不需要使緩衝內容隨任何指定參數發生變化,則可將該值設為“none”。如果要使輸出緩衝根據所有參數值發生變化,則將屬性設定為“*”。

建立網頁輸出快取檔案依賴

範例程式碼:Response.AddFileDependency(MapPath("test.xml"));
如需要建立依賴多檔案關係,則使用AddFileDependencies()方法。

使用編程方式設定頁面緩衝到期

範例程式碼:HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/test.aspx"));
此方法只接受一個"虛擬絕對"路徑,因此需用Page.ResolveUrl()方法轉換

使用編程方式設定多個頁面緩衝到期(建立鍵依賴(key dependency))

範例程式碼:
快取頁面面:PageLoad:
Cache.Insert(“key”,DateTime.Now);
Response.AddCacheItemDependency("key");
通過此法向多個頁面添加依賴項
移除依賴項:PageLoad:
Cache.Remove("key");

以編程方式操作網頁輸出快取

操作由Response.Cache屬性暴露的HttpCachePolicy類對象的方法。

建立網頁輸出快取配置

複製代碼 代碼如下: <system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheProfile1" duration="60" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>

2.部分頁面緩衝

緩衝後替換

採用聲明方式,使用Substitution控制項,設定MethodName屬性所需的方法,此方法必須是靜態方法,因為當前頁輸出緩衝時,頁面執行個體還沒被建立。註:AdRotator內部使用了緩衝後替代。

以編程方式設定緩衝後替換,使用Response.WriteSubstitution()方法,好處:1,此方法引用的方法不一定是當前類的方法,可以是另一個類的實力或靜態方法。2,可以在自訂控制項中使用此方法實現緩衝後替換。

部分頁面緩衝:使用者控制項緩衝

給使用者控制項添加<%@ OutputCache%>指令。此指令包含一個Shared屬性,可設定共用使用者控制項的輸出緩衝。

以編程方式設定使用者控制項緩衝

當使用者控制項中包括<%@ OutputCache%>指令時,可以通過使用者控制項的CachePolicy屬性所暴露的ControlCachePolicy類的執行個體的屬性控制修改空間如何緩衝。

建立使用者控制項緩衝的檔案依賴

可以使用CacheControlPolicy.Dependency屬性在一個緩衝了的使用者控制項和檔案系統中一個檔案間建立一個依賴,範例程式碼:
PageLoad:
CacheDependency depend=new CacheDependency(MapPath("~/test.xml"));
this.CachePolicy.Dependency=depend;

緩衝動態載入的使用者控制項

可以使用Page.LoadControl()方法載入使用者控制項,當具有緩衝特性的使用者控制項被載入時,Asp.net Framework自動一個PartialCachingControl類的執行個體封裝使用者控制項。範例程式碼:
PageLoad:
PartialCachingControl cacheme=(PartialCachingControl)Page.LoadControl("test.ascx");
Cacheme.CachePolicy.SetExpires(DateTime.Now.AddSeconds(10));
PlaceHolder1.Controls.Add(cacheme);
Lable1.Text=cacheme.CachePolicy.Duration.ToString();

3.使用DataSource緩衝

SqlDataSource、ObjectDataSource、XmlDataSource控制項都包括了用於緩衝DataSource承載的屬性,好處是資料來源控制項可以在資料更新時自動重新載入資料。並且可以在多個頁面間共用相同的資料,通過一些屬性的組合來識別:SelectCommand、SelectParameters、ConnectionString。如果屬性相同,即共用相同的快取資料。

通過設定屬性設定緩衝到期策略

包括絕對緩衝(EnableCaching="True" CacheDuration=“xxx”)和Sliding緩衝(EnableCaching="True" CacheExpirationPolicy="Sliding" CacheDuration=“xxx”)

使用ObjectDataSource控制項緩衝

通過設定控制項的EnableCaching、CacheExpirationPolicy、CacheDuration屬性以及SelectMethod所制定的方法名來完成。

使用XmlDataSource控制項緩衝

設定DataFile屬性建立一個檔案依賴。

建立資料來源控制項索引值依賴

操作步驟
1、設定資料來源控制項的CacheKeyDependency屬性(key);
2、在Global.asax建立初始化的(key)快取項目。代碼如下:

複製代碼 代碼如下: Void Application_Start(Object Sender,EventArgs e)
{
HttpContext context=HttpContext.Current;
context.Cache.Insert(
"key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
);
}

3、在用於更改資料的頁面上移除快取項目(key);
如在DetailsView控制項的ItemInserted事件中重新插入快取項目,此時每個依賴於這個索引值(key)的DataSource會自動重新載入資料,代碼如下:複製代碼 代碼如下: protected void DetailsView_ItemInserted(object sender,DetailsViewInsertedEventArgs e)
{
Cache.Insert("key",Datetime.Now);
}

註:以上key值採用目前時間並非必須。

4.Cache對象

幾乎可以給緩衝添加任何對象,例如,可以添加自訂控制項,DataSet,DataTable,ArrayList和List到緩衝。注意:使用從緩衝中返回的任何項目,應該總是要檢查項目是否為空白,如果一個項目已經被刪除了,則當將來試圖從緩衝中讀取時,就會返回null。
詳細資料查看msdnCache 成員
添加資料緩衝到Cache對象範例程式碼:

複製代碼 代碼如下: void Page_Load()
{
DataTable dt=(DataTable)Cache["dtkey"];
if(dt==null)
{
dt=getdtFromDB(); //此處調用方法從資料庫中返回資料項目DataTable
Cache.Insert("dtKey",dt,null,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration); //此處使用絕對到期策略添加項目
}
GridView1.DataSource=dt;
GridView1.DataBind();
}
private DataTable getdtFromDB()
{
//略......
}

使用依賴添加項目

Asp.net Framework包括三種緩衝依賴
1、CacheDependency——用於建立一個檔案依賴或緩衝索引值依賴。
2、SqlCacheDependency——用於建立一個對於Microsoft SQL Server資料庫表或SQL Server 2005資料庫查詢的依賴。
3、AggregateCacheDependency——用於使用多個CacheDependency對象建立依賴,例如,可以用該對象組合檔案和Sql依賴。

CacheDependency類是基類,其他兩個類都是從該類繼承。

指定快取項目優先順序

可以指定CacheItemPriority枚舉類型任意值。

配置緩衝

詳細資料查看Msdn Caching元素

5.使用SQL緩衝依賴

Asp.net Framework支援兩種類型的SQL緩衝依賴:拉和推。第一種模式使用表輪詢的 ASP.NET 實現,第二種模式使用 SQL Server 2005 的查詢通知功能。可以對任何最近版本的Ms SQL Server,包括Ms SQL server 2005 Express、Ms SQL Server 2000 和 Ms SQL Server 7.0,使用拉SQL緩衝依賴。第二種類型推緩衝依賴則只能用於Ms SQL Server 2005和Ms SQL server 2005 Express,因為他們依賴SQL Server的Service Broker。

使用拉SQL緩衝依賴

實質上拉SQL緩衝依賴使用資料庫tigger,當表被修改時,tigger被觸發,名為AspNet_SqlCacheTablesForChangeNotification的資料表的一行資料被更新,來記錄修改情況,Asp.net Framework使用一個後台線程,來定期拉資料表的修改資訊。如果有修改,則依賴於資料表的快取項目被移除。
配置拉SQL緩衝依賴:
1、必須對一個或多個資料庫表啟用SQL緩衝依賴。

可以使用架構中的SqlCacheDependencyAdmin類來配置SQL資料庫支援拉SQL緩衝依賴,由於調用該類的方法需要建立表、預存程序、trigger,出於安全考慮,Asp.net進程並不應該被賦予這些許可權,而是通過一個命令列工具來使用此類。
aspnet_regsql 詳細資料訪問Msdn ASP.NET SQL Server 註冊工具 (Aspnet_regsql.exe)

簡要步驟: 1、啟用特定資料庫的SQL緩衝依賴。
aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed
2、啟用特定表的SQL緩衝依賴。
aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed -t Titles

2、必須在Web設定檔中配置SQL緩衝依賴。

複製代碼 代碼如下: <!-- caching section group -->
<caching>
<sqlCacheDependency enabled = "true" pollTime = "1000" > //通過pollTime 的設定,定時拉資料庫的修改
<databases>
<add name="Northwind"
connectionStringName="NorthwindConnectionString1"
pollTime = "1000"
/>
</databases>
</sqlCacheDependency>
</caching>

a、 對網頁輸出快取使用拉SQL緩衝依賴:<%@ OutputCache%>指令指定sqlDependency屬性值:庫名和表名(Mydatabase:Mytable);

b、對DataSource控制項使用拉SQL緩衝依賴:為DataSource控制項sqlDependency屬性指定值:庫名和表名(Mydatabase:Mytable);

c、對Cache對象使用拉SQL緩衝依賴:

複製代碼 代碼如下: void Page_Load()
{
DataTable dt=(DataTable)Cache["dtkey"];
if(dt==null)
{
dt=getdtFromDB(); //此處調用方法從資料庫中返回資料項目DataTable
SqlCacheDependency sqlDepend=new SqlCacheDependecy("Mydatabase","Mytable");
Cache.Insert("dtKey",dt,sqlDepend);
}
GridView1.DataSource=dt;
GridView1.DataBind();
}
private DataTable getdtFromDB()
{
//略......
}

使用推SQL緩衝依賴

通過Service Broker可以在資料庫中的資料變更時自動給應用程式發送一個訊息。
好處:Asp.net應用程式不必定時拉資料庫的修改。
缺點:查詢類型有諸多限制(如必須使用兩部分的表明:abo.mytabel,查詢必須包含一個顯示的列名表明:不能使用*,不能引用視圖、暫存資料表等,不能包含子查詢、外串連、子串連,不能引用大對象、不能使用DISTINCT、COMPUTE、COMPUTE BY、INSERT關鍵字、不能包含許多彙總函式 等等)

1.為推SQL緩衝依賴設定資料庫
啟用Ms SQL Server 2005 Service Broker:
a、可以通過:Select name ,is_broker_enabled from sys_databases,查詢是否對特定的資料庫啟用。
b、通過:Alter Database MyBase Set ENABLE_BROKER,啟用。
c、為本地AspNet帳號賦予需要的許可權,如:Grant Subscribe Query Notifications To “yourserver\Aspnet”

也就是說sql緩衝暫時只支援ms sql server 2005或以上,他們才有依賴通知。否則快取無效判定。

2.為推SQL緩衝依賴配置應用程式

複製代碼 代碼如下: void Application_Start(object sender, EventArgs e)
{
string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
SqlDependency.Start(conString);
HttpContext context=HttpContext.Current;
context.Cache.Insert(
"key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
);
}

a、對網頁輸出快取使用推SQL緩衝依賴:
當緩衝整個Asp.net頁面時,可以使用推Sql緩衝依賴。如果包含在頁面上的任何Sql命令的結果有變動,頁面就會自動從緩衝中到期。
SqlCommand對象包含一個NotificationAutoEnlist屬性,該屬性預設值為true。當NotificationAutoEnlist啟用時,頁面和命令間自動建立一個推緩衝依賴。注意SqlDataSource的SelectCommand必須符合查詢要求。

b、對DataSource控制項使用推SQL緩衝依賴:
只需要設定SqlcacheDependency屬性即可。設定SqlCacheDependency=“CommandNotification”

c、對Cache對象使用推SQL緩衝依賴:複製代碼 代碼如下: void Page_Load()
{
DataTable dt=(DataTable)Cache["dtkey"];
if(dt==null)
{
string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
SqlDatadapter dad=new SqlDataAdapter("Select a,b From dbo.Mytable",conString); //注意查詢符合要求
SqlCacheDependency sqlDepend=new SqlCacheDependecy(dad.SelectCommand);
dt=new DataTable();
dad.Fill(dt);
Cache.Insert("dtKey",dt,sqlDepend);
}
GridView1.DataSource=dt;
GridView1.DataBind();
}

注意,SqlCacheDependency類的樣本被建立了。一個SqlCommand對象被傳遞給SqlCacheDependency類的建構函式。如果SqlCommand的結果變化了,則這個DataTable會自動從緩衝中失效。這些命令的順序很重要。必須在執行該命令之前建立SqlCacheDependency對象。如果在建立SqlCacheDependency對象之前調用Fill()方法,則依賴會被忽略。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.