共用方式為


快取

Microsoft提供

瞭解快取對於效能良好的 ASP.NET 應用程式很重要。 ASP.NET 1.x 提供三種不同的快取選項;輸出快取、片段快取和快取 API。

瞭解快取對於效能良好的 ASP.NET 應用程式很重要。 ASP.NET 1.x 提供三種不同的快取選項;輸出快取、片段快取和快取 API。 ASP.NET 2.0 提供這三種方法,但會新增一些重要的額外功能。 有數個新的快取相依性,開發人員現在可以選擇建立自訂快取相依性。 在 ASP.NET 2.0 中,也大幅改善快取的設定。

新功能

快取設定檔

快取設定檔可讓開發人員定義可套用至個別頁面的特定快取設定。 例如,如果您有一些頁面應該在 12 小時後從快取過期,您可以輕鬆地建立可套用至這些頁面的快取設定檔。 若要新增快取設定檔,請使用 < 組態檔中的 outputCacheSettings > 區段。 例如,以下是名為 twoday 的快取設定檔設定,其設定快取持續時間為 12 小時。

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

若要將此快取設定檔套用至特定頁面,請使用 @ OutputCache 指示詞的 CacheProfile 屬性,如下所示:

<%@ OutputCache CacheProfile="TwoDay" %>

自訂快取相依性

ASP.NET 1.x 開發人員針對自訂快取相依性而說出。 在 ASP.NET 1.x 中,CacheDependency 類別已密封,可防止開發人員從中衍生自己的類別。 在 ASP.NET 2.0 中,已移除該限制,且開發人員可以自由開發自己的自訂快取相依性。 CacheDependency 類別可讓您根據檔案、目錄或快取索引鍵建立自訂快取相依性。

例如,下列程式碼會根據位於 Web 應用程式的根目錄中名為 stuff.xml 的檔案,建立新的自訂快取相依性:

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

在此案例中,當stuff.xml檔案變更時,快取的專案會失效。

您也可以使用快取索引鍵來建立自訂快取相依性。 使用此方法,移除快取索引鍵將會使快取的資料失效。 下列範例會加以說明:

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

若要使上面插入的專案失效,只要移除插入快取的專案,即可作為快取索引鍵。

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

請注意,做為快取索引鍵之專案的索引鍵必須與新增至快取索引鍵陣列的值相同。

Polling-Based SQL 快取相依性 (也稱為Table-Based相依性)

SQL Server 7 和 2000 使用以輪詢為基礎的模型來進行 SQL 快取相依性。 輪詢型模型會在資料表中的資料變更時,在資料庫資料表上使用觸發程式。 該觸發程式會更新通知資料表中 ASP.NET 定期檢查的 changeId 欄位。 如果 changeId 欄位已更新,ASP.NET 知道資料已變更,並使快取的資料失效。

注意

SQL Server 2005 也可以使用以輪詢為基礎的模型,但因為輪詢型模型不是最有效率的模型,建議您使用查詢型模型, (稍後討論的查詢模型) 搭配 SQL Server 2005。

為了讓 SQL 快取相依性使用輪詢型模型正常運作,資料表必須啟用通知。 這可以透過程式設計方式使用 SqlCacheDependencyAdmin 類別或使用 aspnet_regsql.exe 公用程式來完成。

下列命令列會在 Northwind 資料庫中註冊 Products 資料表,該資料表位於名為dbase的 SQL 快取相依性SQL Server實例上。

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

以下是上述命令中使用的命令列參數說明:

命令列參數 目的
-S server 指定伺服器名稱。
-ed 指定應該針對 SQL 快取相依性啟用資料庫。
-d database_name 指定應針對 SQL 快取相依性啟用的資料庫名稱。
-E 指定連接到資料庫時,aspnet_regsql應該使用Windows 驗證。
-Et 指定我們正在啟用 SQL 快取相依性的資料庫資料表。
-t table_name 指定要針對 SQL 快取相依性啟用的資料庫資料表名稱。

注意

有其他參數可供aspnet_regsql.exe使用。 如需完整清單,請執行 aspnet_regsql.exe -? 從命令列。

當此命令對SQL Server資料庫執行下列變更時:

  • 加入 AspNet_SqlCacheTablesForChangeNotification 資料表。 此資料表針對已啟用 SQL 快取相依性之資料庫中的每個資料表,各包含一個資料列。
  • 下列預存程式是在資料庫中建立的:
AspNet_SqlCachePollingStoredProcedure 查詢AspNet_SqlCacheTablesForChangeNotification資料表,並傳回針對 SQL 快取相依性啟用的所有資料表,以及每個資料表的 changeId 值。 此預存程式用於輪詢,以判斷資料是否已變更。
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure 藉由查詢AspNet_SqlCacheTablesForChangeNotification資料表,傳回針對 SQL 快取相依性啟用的所有資料表,並傳回針對 SQL 快取相依性啟用的所有資料表。
AspNet_SqlCacheRegisterTableStoredProcedure 在通知資料表中新增必要的專案,並新增觸發程式,以註冊 SQL 快取相依性資料表的資料表。
AspNet_SqlCacheUnRegisterTableStoredProcedure 移除通知資料表中的專案並移除觸發程式,以取消註冊 SQL 快取相依性資料表的資料表。
AspNet_SqlCacheUpdateChangeIdStoredProcedure 更新變更資料表的 changeId 來遞增通知資料表。 ASP.NET 會使用此值來判斷資料是否已變更。 如下所示,啟用資料表時所建立的觸發程式會執行此預存程式。
  • 系統會為數據表建立名為table_name_AspNet_SqlCacheNotification_Trigger的SQL Server觸發程式。 此觸發程式會在資料表上執行 INSERT、UPDATE 或 DELETE 時執行AspNet_SqlCacheUpdateChangeIdStoredProcedure。
  • 名為aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess 的SQL Server角色會新增至資料庫。

aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess SQL Server角色具有AspNet_SqlCachePollingStoredProcedure的 EXEC 許可權。 為了讓輪詢模型正常運作,您必須將進程帳戶新增至aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess角色。 aspnet_regsql.exe工具不會為您執行這項操作。

設定 SQL 快取相依性Polling-Based

設定以輪詢為基礎的 SQL 快取相依性需要數個步驟。 第一個步驟是啟用資料庫和資料表,如上所述。 完成此步驟之後,其餘組態如下:

  • 設定 ASP.NET 組態檔。
  • 設定 SqlCacheDependency

設定 ASP.NET 組態檔

除了如上一個課程模組所述新增連接字串之外,您也必須使用 < sqlCacheDependency > 元素來設定 < 快取 > 元素,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

此設定可啟用 pubs 資料庫的 SQL 快取相依性。 請注意,sqlCacheDependency > 元素中的 < pollTime 屬性預設為 60000 毫秒或 1 分鐘。 (這個值不能小於 500 毫秒。) 在此範例中 < ,add > 元素會新增資料庫並覆寫 pollTime,並將其設定為 9000000 毫秒。

設定 SqlCacheDependency

下一個步驟是設定 SqlCacheDependency。 若要完成,最簡單的方式是在 @ Outcache 指示詞中指定 SqlDependency 屬性的值,如下所示:

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

在上述 @ OutputCache 指示詞中,會為pubs資料庫中的作者資料表設定 SQL 快取相依性。 您可以藉由以分號分隔多個相依性來設定相依性,如下所示:

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

設定 SqlCacheDependency 的另一種方法是以程式設計方式執行。 下列程式碼會在pubs資料庫中的authors資料表上建立新的 SQL 快取相依性。

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

以程式設計方式定義 SQL 快取相依性的優點之一,就是您可以處理可能發生的任何例外狀況。 例如,如果您嘗試為尚未啟用通知的資料庫定義 SQL 快取相依性,將會擲回 DatabaseNotEnabledForNotificationException 例外狀況 。 在此情況下,您可以呼叫 SqlCacheDependencyAdmin.EnableNotifications 方法來嘗試啟用資料庫以取得通知,並傳遞資料庫名稱。

同樣地,如果您嘗試為尚未啟用通知的資料表定義 SQL 快取相依性,將會擲回 TableNotEnabledForNotificationException 。 接著,您可以呼叫 SqlCacheDependencyAdmin.EnableTableForNotifications 方法,並將資料庫名稱和資料表名稱傳遞給它。

下列程式碼範例說明如何在設定 SQL 快取相依性時正確設定例外狀況處理。

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

詳細資訊: https://msdn.microsoft.com/library/t9x04ed2.aspx

Query-Based SQL 快取相依性 (SQL Server僅限 2005)

針對 SQL 快取相依性使用 SQL Server 2005 時,不需要輪詢型模型。 搭配 SQL Server 2005 使用時,SQL 快取相依性會透過 SQL 連線直接與SQL Server實例通訊, (不需要進一步的設定,) 使用 SQL Server 2005 查詢通知。

啟用查詢型通知最簡單的方式,就是將資料來源物件的 SqlCacheDependency 屬性設定為 CommandNotification ,並將 EnableCaching 屬性設定為 true,以宣告方式執行這項操作。 使用這個方法時,不需要任何程式碼。 如果針對資料來源執行的命令結果變更,則會使快取資料失效。

下列範例會設定 SQL 快取相依性資料來源控制項:

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

在此情況下,如果 SelectCommand 中指定的查詢傳回的結果與原本的結果不同,則快取的結果會失效。

您也可以將@ OutputCache指示詞的SqlDependency屬性設定為CommandNotification,以指定 SQL 快取相依性啟用所有資料來源。 下列範例說明這一點。

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

注意

如需 SQL Server 2005 中查詢通知的詳細資訊,請參閱《線上叢書》SQL Server。

另一個設定查詢型 SQL 快取相依性的方法,是使用 SqlCacheDependency 類別以程式設計方式執行此作業。 下列程式碼範例說明如何完成此作業。

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

詳細資訊: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

快取後替代

快取頁面可能會大幅增加 Web 應用程式的效能。 不過,在某些情況下,您需要快取大部分的頁面,而且頁面內的部分片段是動態的。 例如,如果您建立一頁完全靜態的新聞報導一段設定期間,您可以設定要快取的整個頁面。 如果您想要在每個頁面要求中包含已變更的旋轉廣告橫幅,則包含廣告的頁面部分必須是動態的。 若要允許您快取頁面,但動態取代某些內容,您可以使用 ASP.NET 快取後替代。 使用快取後替代,整個頁面會以標示為豁免快取的特定部分來快取輸出。 在廣告橫幅的範例中,AdRotator 控制項可讓您利用快取後置替代功能,讓廣告動態建立給每個使用者,以及針對每個頁面重新整理。

實作快取後替代的方法有三種:

  • 以宣告方式,使用替代控制項。
  • 以程式設計方式使用替代控制項 API。
  • 隱含地使用 AdRotator 控制項。

替代控制項

ASP.NET 替代控制項會指定動態建立而非快取之快取頁面的區段。 您會將替代控制項放在您想要顯示動態內容之頁面上的位置。 在執行時間,替代控制項會呼叫您使用 MethodName 屬性指定的方法。 方法必須傳回字串,然後取代替代控制項的內容。 方法必須是包含 Page 或 UserControl 控制項上的靜態方法。 使用替代控制項會導致用戶端快取性變更為伺服器快取性,因此不會在用戶端上快取頁面。 這可確保未來對頁面的要求會再次呼叫 方法,以產生動態內容。

替代 API

若要以程式設計方式建立快取頁面的動態內容,您可以在頁面程式碼中呼叫 WriteSubstitution 方法,並將方法的名稱傳遞為參數。 處理動態內容建立的方法會採用單一 HttpCoNtext 參數並傳回字串。 傳回字串是將在指定位置取代的內容。 呼叫 WriteSubstitution 方法,而不是以宣告方式使用替代控制項的優點是您可以呼叫任何任意物件的方法,而不是呼叫 Page 或 UserControl 物件的靜態方法。

呼叫 WriteSubstitution 方法會導致用戶端快取性變更為伺服器快取性,因此不會在用戶端上快取頁面。 這可確保未來對頁面的要求會再次呼叫 方法,以產生動態內容。

AdRotator 控制項

AdRotator 伺服器控制項會在內部實作對快取後替代的支援。 如果您在頁面上放置 AdRotator 控制項,無論是否已快取父頁面,它都會在每個要求上呈現唯一的公告。 因此,包含 AdRotator 控制項的頁面只會快取伺服器端。

ControlCachePolicy 類別

ControlCachePolicy 類別可讓您使用使用者控制項,以程式設計方式控制片段快取。 ASP.NET 在 BasePartialCachingControl 實例內嵌使用者控制項。 BasePartialCachingControl 類別代表已啟用輸出快取的使用者控制項。

當您存取PartialCachingControl控制項的BasePartialCachingControl.CachePolicy屬性時,一律會收到有效的 ControlCachePolicy 物件。 不過,如果您存取UserControl控制項的UserControl.CachePolicy屬性,只有當使用者控制項已經由 BasePartialCachingControl 控制項包裝時,才會收到有效的 ControlCachePolicy 物件。 如果未包裝它,屬性所傳回的 ControlCachePolicy 物件會在您嘗試操作它時擲回例外狀況,因為它沒有相關聯的 BasePartialCachingControl。 若要判斷 UserControl 實例是否支援快取而不產生例外狀況,請檢查 SupportsCaching 屬性。

使用 ControlCachePolicy 類別是您可以啟用輸出快取的數種方式之一。 下列清單描述可用來啟用輸出快取的方法:

  • 使用 @ OutputCache 指示詞,在宣告式案例中啟用輸出快取。
  • 使用 PartialCachingAttribute 屬性來啟用程式碼後置檔案中使用者控制項的快取。
  • 使用 ControlCachePolicy 類別,在您使用先前其中一種方法啟用的 BasePartialCachingControl 實例,並使用 System.Web.UI.TemplateControl.LoadControl 方法動態載入的 BasePartialCachingControl 實例中指定快取設定。

ControlCachePolicy 實例只能在控制項生命週期的 Init 和 PreRender 階段之間成功操作。 如果您在 PreRender 階段之後修改 ControlCachePolicy 物件,ASP.NET 擲回例外狀況,因為轉譯控制項之後所做的任何變更都不會影響快取設定, (在轉譯階段期間快取控制項) 。 最後,使用者控制項實例 (,因此其 ControlCachePolicy 物件) 僅適用于實際轉譯時的程式設計操作。

快取組態的變更 - 快 < 取 > 專案

在 ASP.NET 2.0 中,快取設定有幾個變更。 快 < 取 > 專案是 ASP.NET 2.0 中的新功能,可讓您在組態檔中進行快取組態變更。 下列屬性可供使用。

Element 說明
緩存 選擇性項目。 定義全域應用程式快取設定。
outputCache 選擇性項目。 指定全應用程式的輸出快取設定。
outputCacheSettings 選擇性項目。 指定可套用至應用程式中頁面的輸出快取設定。
sqlCacheDependency 選擇性項目。 設定 ASP.NET 應用程式的 SQL 快取相依性。

快 < 取 > 專案

快取 > 專案中提供 < 下列屬性:

Attribute 說明
disableMemoryCollection 選擇性 Boolean 屬性。 取得或設定值,指出機器處於記憶體壓力停用時,是否發生的快取記憶體集合。
disableExpiration 選擇性 Boolean 屬性。 取得或設定值,指出是否停用快取到期。 停用時,快取的專案不會過期,而且不會發生過期快取專案的背景清除。
privateBytesLimit 選擇性 的 Int64 屬性。 取得或設定值,指出快取開始排清過期專案並嘗試回收記憶體之前,應用程式私用位元組的大小上限。 此限制包括快取所使用的記憶體,以及執行中應用程式的一般記憶體額外負荷。 零的設定表示 ASP.NET 會使用自己的啟發學習法來判斷何時開始回收記憶體。
percentagePhysicalMemoryUsedLimit 選擇性 的 Int32 屬性。 取得或設定值,指出在快取開始排清過期專案並嘗試回收記憶體之前,應用程式可以取用的電腦實體記憶體百分比上限。此記憶體使用量包括快取所使用的記憶體,以及執行中應用程式的一般記憶體使用量。 零的設定表示 ASP.NET 會使用自己的啟發學習法來判斷何時開始回收記憶體。
privateBytesPollTime 選擇性 TimeSpan 屬性。 取得或設定值,指出輪詢應用程式私用位元組記憶體使用量之間的時間間隔。

<outputCache > 元素

下列屬性適用于 < outputCache > 元素。

Attribute 說明
enableOutputCache 選擇性 Boolean 屬性。 啟用/停用頁面輸出快取。 如果停用,則不論程式設計或宣告式設定為何,都不會快取任何頁面。 預設值為 true。
enableFragmentCache 選擇性 Boolean 屬性。 啟用/停用應用程式片段快取。 如果停用,則不論使用的 @ OutputCache 指示詞或快取設定檔為何,都不會快取任何頁面。 包含快取控制項標頭,指出上游 Proxy 伺服器和瀏覽器用戶端不應該嘗試快取頁面輸出。 預設值為 false
sendCacheControlHeader 選擇性 Boolean 屬性。 取得或設定值,指出輸出快取模組預設是否傳送 快取控制項:private 標頭。 預設值為 false
omitVaryStar 選擇性 Boolean 屬性。 啟用/停用在回應中傳送 Http 「 Vary: < /strong >」 標頭。若預設設定為 false,則會針對輸出快取頁面傳送 「*Vary: *」 標頭。傳送 Vary 標頭時,它會根據 Vary 標頭中指定的專案來快取不同的版本。例如,Vary:User-Agents會根據發出要求的使用者代理程式來儲存不同版本的頁面。預設值為 **false

<outputCacheSettings > 元素

<outputCacheSettings > 元素允許如先前所述建立快取設定檔。 outputCacheSettings > 元素的唯一子項目是 < 用於設定快取設定檔的 < outputCacheProfiles > 元素。

<sqlCacheDependency > 元素

下列屬性適用于 < sqlCacheDependency > 元素。

Attribute 說明
「已啟用」 必要的 布林 值屬性。 指出是否輪詢變更。
pollTime 選擇性 的 Int32 屬性。 設定 SqlCacheDependency 輪詢資料庫資料表以進行變更的頻率。 這個值會對應到連續輪詢之間的毫秒數。 它不能設定為小於 500 毫秒。 預設值為 1 分鐘。

相關資訊

您應該注意有關快取設定的其他一些資訊。

  • 如果未設定背景工作進程私用位元組限制,快取將會使用下列其中一個限制:

    • x86 2GB:800MB 或 60% 的實體 RAM,無論哪一個都更少
    • x86 3GB:1800MB 或 60% 的實體 RAM,無論哪一個比較少
    • x64:1 TB 或 60% 的實體 RAM,無論哪一個較少
  • 如果同時設定背景工作進程私用位元組限制和 < 快取 privateBytesLimit/ > ,則快取會使用至少兩者。

  • 就像在 1.x 中一樣,我們會卸載快取專案並呼叫 GC。收集有兩個原因:

    • 我們非常接近私人位元組限制
    • 可用的記憶體接近或小於 10%
  • 您可以將快取 percentagePhysicalMemoryUseLimit/ > 設定 < 為 100,以有效地停用低可用記憶體條件的修剪和快取。

  • 不同于 1.x,2.0 會在最後一個 GC 時暫停修剪並收集呼叫。收集不會減少私人位元組或受管理堆積大小超過 1% 的 (快取) 記憶體限制。

Lab1:自訂快取相依性

  1. 建立新網站。

  2. 新增名為 cache.xml 的新 XML 檔案,並將它儲存至 Web 應用程式的根目錄。

  3. 將下列程式碼新增至 default.aspx 程式碼後置中的 Page_Load 方法:

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. 將下列內容新增至來源檢視中的 default.aspx 頂端:

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. 流覽 Default.aspx。 時間會說什麼?

  6. 重新整理瀏覽器。 時間會說什麼?

  7. 開啟cache.xml並新增下列程式碼:

    <anElement></anElement>
    
  8. 儲存cache.xml。

  9. 重新整理您的瀏覽器。 時間會說什麼?

  10. 說明更新時間的原因,而不是顯示先前快取的值:

實驗室 2:使用Polling-Based快取相依性

此實驗室會使用您在上一個課程模組中建立的專案,允許透過 GridView 和 DetailsView 控制項編輯 Northwind 資料庫中的資料。

  1. 在 Visual Studio 2005 中開啟專案。

  2. 針對 Northwind 資料庫執行aspnet_regsql公用程式,以啟用資料庫和 Products 資料表。 從 Visual Studio 命令提示字元使用下列命令:

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. 將下列內容新增至您的web.config檔案:

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. 新增名為 showdata.aspx 的新 Webform。

  5. 將下列 @ outputcache 指示詞新增至 showdata.aspx 頁面:

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. 將下列程式碼新增至 showdata.aspx 的 Page_Load:

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. 將新的 SqlDataSource 控制項新增至 showdata.aspx,並將其設定為使用 Northwind 資料庫連線。 按一下 [下一步]。

  8. 選取 [ProductName] 和 [ProductID] 核取方塊,然後按 [下一步]。

  9. 按一下 [完成]。

  10. 將新的 GridView 新增至 showdata.aspx 頁面。

  11. 從下拉式清單中選擇 [SqlDataSource1]。

  12. 儲存並流覽 showdata.aspx。 記下顯示的時間。