ASP.NET 2.0 中改进的缓存功能 - 很通俗易懂

掌握ASP.NET 2.0:深入缓存技术 ASP.NET 2.0是微软发布的一个重要的.NET Web开发框架版本,它在ASP.NET 1.x的基础上进行了大量的扩展和改进。该框架显著简化了Web应用程序的开发,并提高了开发效率,这使得它在众多Web开发框架中脱颖而出。缓存对象是在内存中存储数据项的一种方式,它允许我们快速地存取频繁访问的数据,降低数据库或外部资源的访问频率。在.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</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
  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"
  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 培训。
VS2022错误列表高效处理:从复制到Excel表格的完整指南 本文详细介绍了在Visual Studio 2022中高效处理错误列表的实用技巧,重点讲解了如何将错误信息一键复制并粘贴到Excel表格中。通过基础操作、自定义视图、筛选功能及常见问题解决方案,帮助开发者将杂乱的编译错误整理成清晰、可排序、可筛选的数据表,极大提升了团队协作、错误分析和项目管理的效率。 阅读详情

相关推荐

ANSA二次开发在线帮助:ANSA和μETA API文档

  为了方便大家学习ANSA二次开发,我将ANSA和μETA二次开发的官方文档整合到了我的个人网站CAECoder中,大家点击ANSA和μETA API官方帮助文档进行访问即可查看。   本站也将开展对ANSA和μETA API文档的翻译工作,请大家持续关注! ANSA和μETA API文档   ANSA和μETA脚本接口是一个应用程序编程接口(API),允许开发人员访问ANSA和μETA核心功能和数据。   ANSA和μETAAPI是Python编程语言的扩展。 Python Python简.

CAECoder 4321

ASP.NET 2.0 中改进的缓存功能

 Stephen Walther      Microsoft Corporation      适用于:      Microsoft ASP.NET 2.0      Microsoft ASP.NET Framework      Microsoft SQL Server      Microsoft Visual Studio .NET      摘要:本文中,Stephen Walthe

他山之石,可以攻玉 1027

(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

Deepracer training 流程

Rainbow 4711

windows server 硬盘满了怎么清理?

本文主要介绍我在维护windows server服务器期间总结的一些磁盘清理方式。如对您有所帮助,不甚荣幸。

guigenyi的专栏 9073

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本

NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..."

zhangyihu321的专栏 1892

FPGA人脸识别检测(先获取人脸图像以及灰度二值化)

由于图片有空洞等缺陷,所以后面要进行中值滤波、腐蚀、膨胀等算法处理,然后再对人脸进行框选,最后显示出来。最终的成像应该是下面这样的。(后面有时间再接着做哈哈哈)5、通过modelsim将操作后的图片数据写入gray_img.txt里面后,用matlab将txt转成图片。1、先用matlab将图片转换成txt数据,代码如下。读取图片的方式按照博客咸鱼里的方式来做,如下。2、FPGA读取txt数据。4、FPGA顶层模块及仿真。3、FPGA灰度二值化。

weixin_46312715的博客 2531

复习连接数据库--制作SQLHelper类完成登陆注册

制作SQLHelper类完成登陆注册 包含文件为 login登陆页,registor注册页,showMsg显示注册信息页,welcome欢迎页,使用session存储信息。 login.aspx页 .red { color:Red; } 用户名: * 密 码: *   Xoncl

qhx556的专栏 839

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 402

C# 生成word 文档 代码 外加 IIS报错解决方案

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using VanCloud.HPCCloud.UserManager; using VanCloud....

weixin_33882443的博客 189

ELK - CentOS7 安装 elasticsearch 7.17.5

elk elasticsearch 安装

qq_19783793的博客 1461

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 617

缓存功能(简单的synchronized和使用读写锁)

使用synchronized: class MyCache{ private Map cache = new HashMap(); public synchronized Object getObject(String key){ //加上锁是为了避免多个线程在得到的value都为null时,都同时去访问数据库 Object value=cache.get(key); if(va

学习笔记 4106

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

转贴:ASP.NET 2.0 中改进的缓存功能

发布日期: 11/2/2004 | 更新日期: 11/2/2004 Stephen Walther Microsoft Corporation 适用于: Microsoft ASP.NET 2.0 Microsoft ASP.NET Framework Microsoft SQL Server Microsoft Visual Studio .NET 摘要:本文中,S...

dcizs46266的专栏 229

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ASP.NET 2.0 缓存清除

最近在学习ASP.NET 2.0,昨天看到了“应用程序数据缓存”中的“缓存依赖”章节,根据书上例子需要实现的功能,自己先按自己的思路编写了一个程序。在调试的过程中发现了一个有关缓存清除的问题。以下是我实现的过程: 通过vs.net 2005建立一个网站项目,然后在其中建立一个新的页面,取名为“CacheDependency.aspx”; 在App_Data文件夹中建立一个

网络乞丐 1394

ASP.NET 2.0的页面缓存功能介绍 [转]

出处:ASP.NET 2.0的页面缓存功能介绍 页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容。实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。设置控件缓存的实质是对用户控件进行缓存配置。主要包括以下3种方法:一是使用...

192

ASP.NET 2.0的页面缓存功能

ASP.NET 2.0的页面缓存功能 收藏 ps:就这东西害我找原因找了一天。。。杀了你。。KILL you。。  页面部分缓存是指输出缓存页面的某些部分,而不是缓存整个页面内容。实现页面部分缓存有两种机制:一种是将页面中需要缓存的部分置于用户控件(.ascx文件)中,并且为用户控件设置缓存功能(包含用户控件的ASP.NET页面可设置也可不设置缓存)。这就是通常所说的“控件缓存”。 ...

149

NET2.0中改进的缓存功能

Author: Stephen Walther    From:Internet       Stephen Walther      Microsoft Corporation      适用于:      Microsoft ASP.NET 2.0      Microsoft ASP.NET Framework      Microsoft SQL Server      Microsoft

Teng_s2000的专栏 1095

[ASP.NET学习笔记之五]ASP.NET 中的缓存功能介绍

ASP.NET 中的缓存功能介绍 ASP.NET的性能状况ASP是脚本解释执行的   ASP.NET的引擎从原理上保证高性能 一次编译 ASP.NET的性能状况       ASP.NET的引擎从原理上保证高性能       CLR Just-in-time Compiler       对多CPU有很好的支持       运行时优化编译       引

lne818的专栏 1087
上一篇: 《解剖PetShop》系列
下一篇: JavaScript的一个有趣测试
imbin
博客等级 码龄22年 6粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值