程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET 2.0 中改進的緩存功能

ASP.NET 2.0 中改進的緩存功能

編輯:.NET實例教程
Stephen Walther
  
  Microsoft Corporation
  
  適用於:
  
  Microsoft ASP.Net 2.0
  
  Microsoft ASP.Net Framework
  
  Microsoft SQL Server
  
  Microsoft Visual Studio .Net
  
  摘要:本文中,Stephen Walther 將重點介紹 ASP.NET 2.0 中新增的緩存功能,以及如何使用這些新功能改進 ASP.Net 應用程序的性能和可擴展性。(本文包含一些指向英文站點的鏈接。)
  
  
  
  本頁內容
   更輕松的數據緩存
   使用 SQL Cache Invalidation
   使用 Post-Cache Substitution
   結論
  
  對於由數據庫驅動的 Web 應用程序來說,要改進其性能,最好的方法就是使用緩存。從數據庫中檢索數據可能是您在 Web 站點上執行的最慢的操作之一。如果能夠將數據庫中的數據緩存到內存中,就無需在請求每個頁面時都訪問數據庫,從而可以大大提高應用程序的性能。
  
  緩存有一個且只有一個缺點,那就是數據過期的問題。如果將數據庫表的內容緩存到內存中,當基礎數據庫表中的記錄發生更改時,您的 Web 應用程序將顯示過期的、不准確的數據。對於某些類型的數據,即便顯示的數據稍微有些過期,影響也不會太大;但對於諸如股票價格和競拍出價之類的數據,即使顯示的數據稍微有些過期也是不可接受的。
  
  Microsoft ASP.NET 1.0 Framework 沒有針對此問題提供一個完善的解決方案。使用 ASP.NET 1.0 Framework 時,您不得不在性能和數據過期之間作出權衡。幸運的是,Microsoft ASP.Net 2.0 Framework 提供了一項新功能,稱為 SQL Cache Invalidation,可以解決這一棘手的問題。
  
  在本文中,您將進一步了解 ASP.NET 2.0 Framework 中許多新的緩存改進功能。首先,您將了解到如何在新增的 DataSource 控件中集成緩存支持。然後,您將了解到如何配置和使用 SQL Cache Invalidation。最後,您將了解到隨 ASP.Net 2.0 Framework 引入的一個新控件:Substitution 控件,使用該控件可以向已緩存的頁面中插入動態內容。
  
  更輕松的數據緩存
  在 ASP.NET 2.0 Framework 中,最大的變化之一就是在 ASP.NET 頁面上訪問數據庫數據的方式發生了變化。ASP.Net 2.0 Framework 包含一組新的控件,統稱為 DataSource 控件。您可以使用這些控件來表示數據源,例如數據庫或 XML 文件。
  
  在 ASP.NET 1.0 Framework 中,是通過將控件綁定到 DataSet 或 DataReader,使用控件來顯示數據庫數據的。而在 ASP.NET 2.0 Framework 中,通常是將控件綁定到 DataSource 控件。通過 DataSource 控件,您可以創建顯示數據庫數據的 ASP.Net 頁面,而不用為訪問數據庫編寫任何代碼。
  
  在處理數據庫數據時,通常使用下列三個 DataSource 控件中的一個控件:
  
  • SqlDataSource — 表示 SQL 數據源,例如 Microsoft SQL Server 或 Oracle 數據庫。
  
  • AccessDataSource — 一個專用的 SqlDataSource 控件,用於 Microsoft Access 數據庫。
  
  • ObjectDataSource — 表示充當數據源的自定義業務對象。
   
   
  例如,假設您要在 DropDownList 控件中顯示從數據庫中檢索到的書目列表(參見圖 1)。列表 1 中的頁面說明了如何將 DropDownList 控件綁定到 SqlDataSource 控件。 
  
  圖 1:使用 SqlDataSource 控件檢索數據
  
  
  列表 1:DisplayTitles.ASPx
  
  <Html>
  <head runat="server">
  <title>Display Titles</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <ASP:DropDownList
  ID="DropDownList1"
  DataSourceId="SqlDataSource1"
  DataTextFIEld="Title"
  Runat="server" />
  
  <ASP:SqlDataSource
  ID="SqlDataSource1"
  ConnectionString="Server=localhost;database=Pubs"
  SelectCommand="SELECT Title FROM Titles"
  Runat="server" />
  
  </form>
  </body>
  </Html>
  
  請注意,列表 1 中的 SqlDataSource 控件用於提供連接字符串,SQL SELECT 命令用於從數據庫中檢索記錄。DropDownList 控件通過其 DataSourceID 屬性綁定到 SqlDataSource 控件。
  
  使用 DataSource 控件緩存數據
  使用 DataSource 控件,不僅可以更輕松地連接數據庫,還使緩存數據庫數據變得更容易。只需在 SqlDataSource 控件上設置一兩個屬性,就可以自動在內存中緩存由 DataSource 控件表示的數據。
  
  例如,如果要將 Titles 數據庫表在內存中緩存至少 10 分鐘,可以按照以下方式聲明 SqlDataSource 控件。
  
   <ASP:SqlDataSource
  ID="SqlDataSource1"
  EnableCaching="true"
  CacheDuration="600"
  ConnectionString="Server=localhost;database=Pubs"
  SelectCommand="SELECT Title FROM Titles"
  Runat="server" />
  
  如果 EnableCaching 屬性的值為 true,SqlDataSource 將自動緩存通過 SelectCommand 檢索到的數據。使用 CacheDuration 屬性,可以指定從數據庫中刷新數據之前緩存數據的時間(以秒為單位)。
  
  默認情況下,SqlDataSource 使用絕對過期策略來緩存數據,即每隔指定的秒數就從數據庫中刷新一次。此外,您還可以選擇使用可變過期策略。如果將 SqlDataSource 配置為使用可變過期策略,那麼只要持續訪問數據,數據就不會過期。如果需要緩存大量項目,使用可變過期策略將非常有用,因為這種過期策略將只在內存中保留訪問最頻繁的項目。
  
  例如,下面的 SqlDataSourceControl 被配置為使用可變過期策略,過期時間為 10 分鐘。
  
  <ASP:SqlDataSource
  ID="SqlDataSource1"
  EnableCaching="true"
  CacheExpirationPolicy="Sliding"
  CacheDuration="600"
  ConnectionString="Server=localhost;database=Pubs"
  SelectCommand="SELECT Title FROM Titles"
  Runat="server" />
  
  由於 CacheExpirationPolicy 屬性的值被設置為 Sliding,CacheDuration 屬性的值被設置為 600,因此,只要在 10 分鐘內持續訪問,此 SqlDataSource 表示的數據就會一直保留在內存中。
  
  返回頁首
  使用 SQL Cache Invalidation
  SQL Cache Invalidation 是 ASP.Net 2.0 Framework 最值得期待的新增功能之一。使用 SQL Cache Invalidation 可以獲得緩存的全部性能優勢,而不用擔心數據過期的問題。SQL Cache Invalidation 使您可以在基礎數據庫中的數據發生更改時自動更新緩存中的數據。
  
  SQL Cache Invalidation 通過在後台不斷輪詢數據庫來檢查數據更改。每隔一定的時間(毫秒),ASP.NET Framework 就會檢查數據庫中是否存在更新。如果 ASP.Net Framework 檢測到任何更改,將從緩存中刪除從數據庫中添加的、依賴於數據庫的任何項目(即,這些項目將過期)。
  
  注意:Microsoft SQL Server 2005 支持一種截然不同的 SQL Cache Invalidation 方法。您可以配置 SQL Server 2005,使其在數據庫、數據庫表或數據庫行發生變化時通知 ASP.NET 應用程序。這樣,ASP.Net Framework 就不需要通過不斷輪詢 SQL Server 2005 數據庫來檢查數據更改了。
  
  需要注意的是,SQL Cache Invalidation 只能用於 Microsoft SQL Server 7 及更高版本,不能用於其他數據庫,例如 Microsoft Access 或 Oracle。
  
  在緩存整個頁面的輸出、使用 DataSource控件或直接使用 Cache 對象時,都可以使用 SQL Cache Invalidation。下面將分別介紹這三種情況。
  
  配置 SQL Cache Invalidation
  在 Web 應用程序中使用 SQL Cache Invalidation 之前,首先必須執行一些配置步驟。必須將 Microsoft SQL Server 配置為支持 SQL Cache Invalidation,還必須在應用程序的 Web 配置文件中添加必要的配置信息。
   
  可以按照以下兩種方法配置 SQL Server:使用 ASPnet_regsql 命令行工具,或者使用 SqlCacheDependencyAdmin 類。
  
  使用 ASPNET_REQSQL 啟用 SQL Cache Invalidation
  使用 aspnet_regsql 工具,您可以通過命令行來配置 SQL Cache Invalidation。ASPnet_regsql 工具位於 Windows\Microsoft.Net\Framework\[版本] 文件夾中。要使用此工具,必須打開命令提示符窗口並浏覽到此文件夾。
  
  要在使用 Pubs 數據庫時支持 SQL Cache Invalidation,需要執行以下命令。
  
  ASPnet_regsql -E -d Pubs -ed
  
  -E 選項使 ASPnet_regsql 工具在連接到數據庫服務器時使用集成的安全設置。-d 選項用於選擇 Pubs 數據庫。最後,-ed 選項用於為數據庫啟用 SQL Cache Invalidation。
  
  執行此命令時,將在數據庫中添加一個名為 ASPNet_SqlCacheTablesForChangeNotification 的新數據庫表。此表包含啟用了 SQL Cache Invalidation 的所有數據庫表的列表。此命令還將在數據庫中添加一組存儲過程。
  
  為數據庫啟用 SQL Cache Invalidation 後,必須從數據庫中選擇要啟用 SQL Cache Invalidation 的特定表。以下命令將為 Titles 數據庫表啟用 SQL Cache Invalidation。
  
  ASPnet_regsql -E -d Pubs -t Titles -et
  
  -t 選項用於選擇數據庫表。-et 選項為數據庫表啟用 SQL Cache Invalidation。當然,您可以通過對每個數據庫表重復執行此命令,為多個表啟用 SQL Cache Invalidation。
  
  執行此命令時,將在數據庫表中添加一個觸發器。只要您對表進行了修改,此觸發器就將觸發並更新 ASPNet_SqlCacheTablesForChangeNotification 表。
  
  最後,要獲取某個特定數據庫中當前啟用了 SQL Cache Invalidation 的表的列表,可以使用以下命令。
  
  ASPnet_regsql -E -d Pubs -lt
  
  此方法將從 ASPNet_SqlCacheTablesForChangeNotification 中選擇表的列表。此外,您也可以通過直接在該數據庫表中執行查詢來檢索此信息。
  
  使用 SqlCacheDependencyAdmin 類
  aspnet_regsql 工具在後台使用 SqlCacheDependencyAdmin 類的方法來配置 Microsoft SQL Server。如果您願意,可以直接從 ASP.Net 頁面中使用此類的方法。
  
  SqlCacheDependencyAdmin 類具有五個重要的方法:
  
  • DisableNotifications — 為特定數據庫禁用 SQL Cache Invalidation。
  
  • DisableTableForNotifications — 為數據庫中的特定表禁用 SQL Cache Invalidation。
  
  • EnableNotifications — 為特定數據庫啟用 SQL Cache Invalidation。
  
  • EnableTableForNotifications — 為數據庫中的特定表啟用 SQL Cache Invalidation。
  
  • GetTablesEnabledForNotifications

— 返回啟用了 SQL Cache Invalidation 的所有表的列表。
  
  
  例如,使用列表 2 中的 ASP.Net 頁面,您可以為 Pubs 數據庫中的任何表配置 SQL Cache Invalidation(參見圖 2)。
  
  圖 2:從 ASP.Net 頁面中啟用 SQL Cache Invalidation
  
  
  列表 2:EnableSCI.ASPx (C#)
  
  <%@ Page Language="c#" %>
  <%@ Import Namespace="System.Web.Caching" %>
  <script runat="server">
  
  const string connectionString = "Server=localhost;Database=Pubs";
  
  void Page_Load()
   {
  if (!IsPostBack)
   {
  SqlCacheDependencyAdmin.EnableNotifications(
  connectionString);
  SqlDataSource1.SelectParameters.Add("connectionString",
  connectionString);
   }
   }
  
  void EnableTable(Object s, EventArgs e)
   {
  try
   {
  SqlCacheDependencyAdmin.EnableTableForNotifications(
  connectionString, txtTableName.Text);
   }
  catch (Exception ex)
   {
  lblErrorMessage.Text = ex.Message;
   }
  txtTableName.Text = "";
   }
  
  </script>
  
  <Html>
  <head runat="server">
  <title>Enable SQL Cache Invalidation&lt;/title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <h1>SQL Cache Invalidation</h1>
  
  以下表格已啟用 SQL Cache Invalidation:
  
  <p>
  <ASP:GridVIEw id="grdTables"
  DataSourceID="SqlDataSource1" CellPadding="10"
  ShowHeader="false" Runat="Server" />
  </p>
  
  <ASP:ObjectDataSource
  ID="SqlDataSource1"
  TypeName="System.Web.Caching.SqlCacheDependencyAdmin"
SelectMethod="GetTablesEnabledForNotifications"
  Runat="Server" />
  <p>
  <ASP:Label ID="lblErrorMessage" EnableVIEwState="false"
  ForeColor="red" Runat="Server" />
  </p>
  
  <ASP:TextBox ID="txtTableName" Runat="Server" />
  <ASP:Button Text="Enable Table" OnClick="EnableTable"
  Runat="Server" />
  
  </form>
  </body>
  </Html>
  
  列表 2:EnableSCI.ASPx (Visual Basic .Net)
  
  <%@ Page Language="vb" %>
  <%@ Import Namespace="System.Web.Caching" %>
  <script runat="server">
  
  Const connectionString As String = "Server=localhost;Database=Pubs"
  
  Sub Page_Load()
  
  If Not IsPostBack Then
  SqlCacheDependencyAdmin.EnableNotifications( _
  connectionString)
  SqlDataSource1.SelectParameters.Add("connectionString", _
  connectionString)
  End If
  End Sub
  
  Sub EnableTable(ByVal s As Object, ByVal e As EventArgs)
  
  Try
  
  SqlCacheDependencyAdmin.EnableTableForNotifications( _
  connectionString, txtTableName.Text)
  Catch ex As Exception
  lblErrorMessage.Text = ex.Message
&nbsp; End Try
  txtTableName.Text = ""
  End Sub
  
  </script>
  
  <Html>
  <head id="Head1" runat="server">
  <title>ConfigureSCI</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <h1>SQL Cache Invalidation</h1>
  
  以下表格已啟用 SQL Cache Invalidation:
  
  <p>
  <ASP:GridVIEw id="grdTables" DataSourceID="SqlDataSource1"
  CellPadding="10" ShowHeader="false" Runat="Server" />
  </p>
  
  <ASP:ObjectDataSource
  ID="SqlDataSource1"
  TypeName="System.Web.Caching.SqlCacheDependencyAdmin"
  SelectMethod="GetTablesEnabledForNotifications"
  Runat="Server" />
  <p>
  <ASP:Label ID="lblErrorMessage" EnableVIEwState="false"
  ForeColor="red" Runat="Server" />
  </p>
  
  <ASP:TextBox ID="txtTableName" Runat="Server" />
  <ASP:Button ID="Button1" Text="Enable Table"
  OnClick="EnableTable" Runat="Server" />
  
  </form>
  </body>
  </Html>
  
  在列表 2 中,connectionString 常量用於選擇啟用了 SQL Cache Invalidation 的數據庫(如果要為 Pubs 數據庫以外的數據庫啟用 SQL Cache Invalidation,可以更改此常量的值)。在 Page_Load 方法中,調用 SqlCacheDependencyAdmin 類上的 EnableNotifications 方法,為由 connectionString 常量指定的數據庫啟用 SQL Cache Invalidation。
  
  列表 2 中的 GridVIEw 顯示了當前啟用了 SQL Cache Invalidation 的所有數據庫表。GridVIEw 被綁定到 ObjectDataSource 控件上,該控件為其 SelectMethod 調用 GetTablesneabledForNotifications 方法。
  
  最後,您可以使用列表 2 中的頁面為其他表啟用 SQL Cache Invalidation。在文本框中輸入表的名稱並單擊“Enable Table”按鈕時,將調用 EnableTableForNotifications 方法。
  
  SQL Cache Invalidation 的 Web 配置設置
  在 ASP.NET 應用程序中使用 SQL Cache Invalidation 之前,下一步要做的是更新您的 Web 配置文件。您需要配置 ASP.Net Framework,以便輪詢啟用了 SQL Cache Invalidation 的數據庫。
   
  列表 3 中的 Web 配置文件包含輪詢 Pubs 數據庫所必需的配置信息。
  
  列表 3:Web.Config
  
  <configuration>
  
  <connectionStrings>
  <add name="MySQLServer"
  connectionString="Server=localhost;Database=Pubs" />
  </connectionStrings>
  
  <system.web>
  
  <caching>
  <sqlCacheDependency enabled="true">
  <databases>
  <add
  name="Pubs"
  connectionStringName="MySQLServer"
  pollTime="60000" />
  </databases>
  </sqlCacheDependency>
  </caching>
  </system.web>
  </configuration>
  
  列表 3 中的 Web 配置文件包含兩部分。<connectionStrings> 部分用於創建數據庫連接字符串,以連接到名為 MySQLServer 的 Pubs 數據庫。
  
  caching 部分用於配置 SQL Cache Invalidation 輪詢。在 <databases> 子部分中,您可以列出要對其進行輪詢以檢查數據更改的一個或多個數據庫。在列表 3 中,MySQLServer 表示的數據庫每分鐘(每 60000 毫秒)輪詢一次。
  
  您可以為不同的數據庫指定不同的輪詢間隔。每次輪詢數據庫以檢查數據更改時,服務器都必須執行一些操作。如果您認為數據庫中的數據不會頻繁地更改,可以增加輪詢間隔。
  
  在頁面輸出緩存中使用 SQL Cache Invalidation
  現在,我們已經完成了 SQL Cache Invalidation 的所有配置步驟,可以在 ASP.Net 頁面中使用它了。一種方法是在頁面輸出緩存中使用 SQL Cache Invalidation。頁面輸出緩存允許您在內存中緩存頁面所顯示的所有內容。通過使用 SQL Cache Invalidation,您可以在(且只在)數據庫表發生更改時自動更新緩存的頁面。
  
  例如,列表 4 中的頁面在 GridVIEw 控件中顯示了 Titles 數據庫表的內容。在該頁面的頂部,OutputCache 指令用於在內存中緩存頁面內容。如果 Titles 數據庫表發生更改,SqlDependency 屬性將使頁面更新。
  
  列表 4:OutputCacheTitles.ASPx
  
  <%@ OutputCache SqlDependency="Pubs:Titles"
  Duration="6000" VaryByParam="none" %>
  <Html>
  <head runat="server">
  <title>Output Cache Titles</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <%= DateTime.Now %>
  
  <ASP:GridVIEw
  ID="grdTitles"
 &nbsp;DataSourceID="SqlDataSource1"
  Runat="Server" />
  
  <ASP:SqlDataSource
  ID="SqlDataSource1"
  SelectCommand="Select * FROM Titles"
  ConnectionString="<%$ ConnectionStrings:MySQLServer %>"
  Runat="Server" />
  
  </form>
  </body>
  </Html>
  
  請注意,SqlDependency 屬性引用了 Web 配置文件中定義的數據庫的名稱。由於我們指定了每分鐘輪詢一次 Pubs 數據庫以檢查數據更改,因此如果對該數據庫進行了更改,列表 4 中的頁面將在一分鐘之內進行更新。
  
  您可以為 SqlDependency 屬性值列出多個數據庫和/或多個數據庫表。要創建多個依賴關系,只需用分號分隔每個依賴關系即可。
  
  在 DataSource 控件中使用 SQL Cache Invalidation
  除了在頁面輸出緩存中使用 SQL Cache Invalidation 之外,還可以直接在 DataSource 控件中使用 SQL Cache Invalidation。如果要在多個頁面中使用相同的數據庫數據,請考慮在 DataSource 控件中使用 SQL Cache Invalidation。SqlDataSource、AccessDataSource 和 ObjectDataSource 控件都支持 SqlCacheDependency 屬性。
  
  例如,列表 5 中的頁面在 SqlDataSource 控件中使用了 SQL Cache Invalidation。
  
  列表 5:SqlDataSourceCaching.ASPx
  
  <Html>
  <head id="Head1" runat="server">
  <title>SqlDataSource Caching</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <%= DateTime.Now %>
  
  <ASP:GridVIEw
  ID="grdTitles"
  DataSourceId="SqlDataSource1"
  Runat="server" />
  
  <ASP:SqlDataSource
  ID="SqlDataSource1"
  EnableCaching="true"
  SqlCacheDependency="Pubs:Titles"
  SelectCommand="select * from titles"
  ConnectionString="<%$ ConnectionStrings:MySQLServer %>"
  Runat="server" />
  
  </form>
  </body>
  </Html>
  
  在列表 5 中,SqlDataSource 控件是使用 EnableCaching 和 SqlCacheDependency 這兩個屬性聲明的。SqlCacheDependency 屬性使用的語法與 OutputCache 指令的 SqlDependency 屬性相同。您需要列出數據庫的名稱,後跟數據庫表的名稱。
   
  在 Cache 對象中使用 SQL Cache Invalidation
  最後,您還可以在 Cache 對象中使用 SQL Cache Invalidation。此選項使您可以最大程度地對 SQL Cache Invalidation 進行編程控制。
  
  要在 Cache 對象中使用 SQL Cache Invalidation,您需要創建一個 SqlCacheDependency 對象實例。使用 Insert 方法在 Cache 中插入新對象時,可以使用 SqlCacheDependency 對象。
  
  例如,列表 6 中的頁面顯示了 Titles 數據庫表中的記錄數。計數是基於對基礎數據庫表的依賴關系進行緩存的。
  
  列表 6:DisplayTitleCount.ASPx (C#)
  
  <%@ Page Language="c#" %>
  <%@ Import Namespace="System.Data.SqlClIEnt" %>
  <script runat="server">
  
  void Page_Load()
   {
  int count = 0;
  
  if (Cache["TitleCount"] != null)
   {
  count = (int)Cache["TitleCount"];
   }
  else
   {
  string connectionString =
  ConfigurationSettings.ConnectionStrings[
  "MySQLServer"].ConnectionString;
  SqlConnection con = new SqlConnection(connectionString);
  SqlCommand cmd = new
  SqlCommand("SELECT Count(*) FROM Titles", con);
  con.Open();
  count = (int)cmd.ExecuteScalar();
  con.Close();
  Cache.Insert("TitleCount", count,
  new SqlCacheDependency("Pubs", "Titles"));
   }
  lblTitleCount.Text = count.ToString();
   }
  
  </script>
  
  <Html>
  <head runat="server">
  <title>Display Title Count</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <ASP:Label ID="lblTitleCount" Runat="Server" />
  
  </form>
  </body>
  </Html>
  
  列表 6:DisplayTitleCount.ASPx (Visual Basic .Net)
  
  <%@ Page Language="vb" %>
  <%@ Import Namespace="System.Data.SqlClIEnt" %>
  <script runat="server">
  
  Sub Page_Load()
  
  Dim count As Integer = 0
  
  If Not Cache("TitleCount") Is Nothing Then
  count = Convert.ToInt32(Cache("TitleCount"))
  Else
  Dim connectionString As String = _
  ConfigurationSettings.ConnectionStrings( _
  "MySQLServer").ConnectionString
  Dim con As New SqlConnection(connectionString)
  Dim cmd As New _
  SqlCommand("SELECT Count(*) FROM Titles", con)
  con.Open()
  count = Convert.ToInt32(cmd.ExecuteScalar())
  con.Close()
  Cache.Insert("TitleCount", count, _
  new SqlCacheDependency("Pubs", "Titles"))
  End If
  
  lblTitleCount.Text = count.ToString()
  End Sub
  
  </script>
  
  <Html>
  <head id="Head1" runat="server">
  <title>Display Titles Count</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  <ASP:Label ID="lblTitleCount" Runat="Server" />
  
  </form>
  </body>
  </Html>
  
  返回頁首
  使用 Post-Cache Substitution
  在許多情況下,您需要緩存頁面的一部分,而不是整個頁面。例如,在您的 Web 站點主頁上,您可能希望同時顯示隨機的標題廣告和數據庫表中的記錄。如果緩存整個頁面,每個用戶都將在每次請求的頁面上看到同一個標題廣告。
  
  要處理這種同時混有動態內容和緩存內容的問題,一種方法是使用 Web 用戶控件。因為可以為 Web 用戶控件添加 OutputCache 指令,所以即使不緩存包含頁面的內容,也可以緩存 Web 用戶控件的內容。
  
  但有時候可能會事與願違。雖然您可以使用 Web 用戶控件在動態頁面上添加緩存的內容,但很多情況下,您實際上是想在緩存的頁面中添加動態內容。例如,假設您要緩存整個頁面的內容,只留一小塊區域用於顯示當前用戶的用戶名。這種情況下最好使用 Post-Cache Substitution。
  
  ASP.Net 2.0 Framework 引入了一種新控件,稱為 Substitution 控件。您可以使用 Substitution 控件在緩存的頁面中插入動態內容。列表 7 中的頁面使用 Substitution 控件將用戶名插入到緩存的內容中(參見圖 3)。
  


  圖 3:使用 Substitution 控件顯示用戶名
  
  
  列表 7:PostCacheSubstitution.ASPx (C#)
  
  <%@ Page Language="C#" %>
  <%@ OutputCache Duration="6000" VaryByParam="none" %>
  
  <script runat="server">
  
  static string DisplayUsername(HttpContext context)
   {
  if (!context.Request.IsAuthenticated)
  return "Anonymous";
  else
  return context.User.Identity.Name;
   }
  
  </script>
  
  <Html>
  <head runat="server">
  <title>Post Cache Substitution</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  Welcome <ASP:Substitution
  MethodName="DisplayUsername" Runat="Server" />!
  
  <p>
  此頁已緩存, 因為時間
  <%= DateTime.Now.ToString("t") %> 並無改變。
  </p>
  
  </form>
  </body>
  </Html>
  
  列表 7:PostCacheSubstitution.ASPx (Visual Basic .Net)
  
  <%@ Page Language="vb" %>
  <%@ OutputCache Duration="6000" VaryByParam="none" %>
  
  <script runat="server">
  
  Shared Function DisplayUsername(ByVal context As HttpContext) _
  As String
  If Not context.Request.IsAuthenticated Then
  Return "Anonymous"
  Else
  Return context.User.Identity.Name
  End If
  End Function
  
  </script>
  
  <Html>
  <head id="Head1" runat="server">
  <title>Post Cache Substitution</title>
  </head>
  <body>
  <form id="form1" runat="server">
  
  Welcome <ASP:Substitution 
  ID="Substitution1"
  MethodName="DisplayUsername"
  Runat="Server" />!
  
  <p>
  此頁已緩存, 因為時間
  <%= DateTime.Now.ToString("t") %> 並無改變。
  </p>
  
  </form>
  </body>
  </Html>
  
  Substitution 控件有一個非常重要的屬性:即 MethodName 屬性。MethodName 屬性用於表示為返回動態內容而調用的方法。由 Substitution 控件調用的方法必須是靜態方法(在 Visual Basic .Net 中共享的方法)。此外,該方法還必須具有一個表示當前 HttpContext 的參數。
  
  在 ASP.Net 2.0 Framework 中,已對 AdRotator 控件進行了修改以支持 Post-Cache Substitution。如果在使用 OutputCache 指令的頁面中添加 AdRotator 控件,AdRotator 控件將自動從其包含頁面的緩存策略中排除出去。
  
  返回頁首
  結論
  緩存對由數據庫驅動的 Web 應用程序的性能具有非常大的影響。幸運的是,ASP.Net 2.0 Framework 提供了許多新的重要增強功能,使您可以在應用程序中更輕松地使用緩存功能。
  
  新增的 DataSource 控件中包含的屬性使得在內存中緩存數據庫數據變得非常容易。通過使用 DataSource 控件,您可以檢索並緩存數據庫數據,而無需編寫任何代碼。
  
  新增的 SQL Cache Invalidation 支持使您可以在基礎數據庫中的數據發生更改時自動在緩存中重新加載數據庫數據。此功能為您提供了緩存的所有性能優勢,而不用擔心數據過期的問題。
  
  最後,使用新增的 Substitution 控件,您可以更輕松地在緩存的頁面中混合動態內容。Substitution 控件為您在緩存的頁面中插入動態內容提供了一個獨立的空間。
  
  作者簡介
  
  Stephen Walther 編寫了有關 ASP.NET 的暢銷書 ASP.NET Unleashed。此外,他還是 ASP.NET Community Starter Kit(Microsoft 開發的 ASP.NET 示例應用程序)的體系結構設計師和主要開發人員。他還通過自己的公司 Superexpert (http://www.superexpert.com/) 為美國的公司(包括 NASA 和 Microsoft)提供 ASP.Net 培訓。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved