利用緩衝,可以極大提高web應用程式的效能。
ASP.NET頁面中執行最慢的操作是資料庫的訪問。開啟一個資料庫連接並讀取資料是很慢的操作。改進效能的最好方法是改進訪問資料的代碼而不是訪問資料庫的代碼。
ASP.NET 2.0 Framework支援下列類型的緩衝:
·網頁輸出快取
·局部頁面緩衝
·資料來源緩衝
·資料緩衝
使用網頁輸出快取
可以給一個頁面添加<% OutputCache %>指令啟動網頁輸出快取。例如,下面代碼使得輸出的頁面能緩衝15秒。
<%@ Page Language="C#" %>
<%@ OutputCache Duration="15" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
lblTime.Text = DateTime.Now.ToString("T");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Cache Page Output</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label
id="lblTime"
Runat="server" />
</div>
</form>
</body>
</html>
使用參數改變輸出緩衝
有時候我們同一個頁面在根據傳入的不同參數時會顯示不同的內容,如果這種情況使用上面的緩衝就會導致傳入任何不用參數都會顯示相同的緩衝內容,這個時候可以使用VaryByParam屬性來解決這個問題。VaryByParam屬性會在傳入不用參數時使頁面緩衝新的執行個體。
<%@ OutputCache Duration="3600" VaryByParam="id" %>
傳入的參數名稱為id。
可以給VaryByParam屬性賦兩個特殊的值。
none——傳入的參數都被忽略了,只有一個版本的頁面緩衝;
*——傳入參數的任意變化都會建立一個新版本的頁面緩衝。
如果希望根據不只一個參數值的變化來建立不用的頁面緩衝版本,那麼可以用分號分隔一組參數列表給VaryByParam屬性。
基於控制項變化的輸出緩衝
VaryByControl屬性用於根據頁面中的特定控制項的不同值來建立不用版本的頁面緩衝。
<%@ OutputCache Duration="3600" VaryByControl="dropCategories" %>
<asp:DropDownList
id="dropCategories"
DataSourceID="srcCategories"
DataTextField="Name"
DataValueField="Id"
Runat="server" />
基於頭變化的輸出緩衝
還有一個選擇是使用VaryByHeader屬性,使得在特定瀏覽器頭的值變化時,可以建立不用版本的緩衝頁面。
幾個標準的瀏覽器頭在每次頁面請求時都會傳遞,這些頭包含:
Accept-Language——代表請求頁面中使用者最希望的有優先順序順序的人類語言列表;
User-Agent——代表請求頁面裝置的類型;
Cookie——代表當前網域名稱下建立的瀏覽器的cookie。
基於瀏覽器變化的輸出緩衝
如果想針對不用瀏覽器使用不用緩衝版本,可以使用VaryByCustom屬性。該屬性接受一個特殊的browser值。當VaryByCustom的值為browser時,瀏覽器的類型和主要版本號被認為重要並需要考慮的。
設定緩衝位置
使用<% Outputcache%>指令的Location屬性指定頁面被緩衝在哪裡。該屬性包含下面值:
Any——頁面被緩衝在瀏覽器、Proxy 伺服器端和web伺服器端;
Client——緩衝在瀏覽器;
DownStream——頁面被緩衝在瀏覽器和任何的Proxy 伺服器端;
None——頁面不緩衝;
ServerAndClient——頁面被緩衝在瀏覽器和web伺服器端;
建立網頁輸出快取檔案依賴
可以在一個快取頁面面和硬碟上的一個檔案(或者一組檔案)之間建立一個依賴。當檔案修改時,快取頁面面自動失效並在下次頁面請求時重建。
<%@ Page Language="C#" %>
<%@ OutputCache Duration="9999" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
Response.AddFileDependency(MapPath("Movies.xml"));
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Output Cache File Dependency</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<asp:GridView
id="grdMovies"
DataSourceID="srcMovies"
Runat="server" />
<asp:XmlDataSource
id="srcMovies"
DataFile="Movies.xml"
Runat="server" />
</div>
</form>
</body>
</html>
上面代碼顯示了目前時間,注意,時間直到Movies.xml檔案被修改時才會變化。代碼中使用了 Response.AddFileDependency()方法在快取頁面面和磁碟上的單個檔案間建立了依賴。如果需要依賴多個檔案,則需要使用AddFileDependencies()代替。
使用編程的方式設定網頁輸出快取到期
可以使用Response.RemoveOutputCacheItem()方法,以編程的方法,從緩衝中移除一個頁面。例如我們前台產品頁面被緩衝了,當在後台添加新的產品時就可以使用編程方式移除前台緩衝的產品頁面。
protected void dtlMovie_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/MovieList.aspx"));
Response.Redirect("~/MovieList.aspx");
}
建立網頁輸出快取配置
通過在Web設定檔中配置網頁輸出快取,從而將這些配置應用於多個頁面。可以建立一個緩衝配置(Cache Profile),將使網站的緩衝更容易管理。
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache1Hour" duration="3600" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
下面代碼使用了Cache1Hour配置。該配置設定於<% OutputCache%>指令的CacheProfile屬性。
<%@ Page Language="C#" %>
<%@ OutputCache CacheProfile="Cache1Hour" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Output Cache Profile</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
</div>
</form>
</body>
</html>
可以給緩衝配置設定和獨立頁面的<%OutputCache%>指令一樣的屬性。