⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outputcaching.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
字号:
<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %>
<%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>

<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->

<h4>页输出缓存</h4>
<!--BEGIN SUB SECTION--> 输出缓存是一种功能强大的技术,它通过缓存从动态页生成的内容来提高请求/响应的吞吐量。默认情况下启用输出缓存,但不缓存来自任何给定响应的输出,除非采取显式操作使该响应成为可缓存的。
<p>
若要使响应满足输出缓存的条件,它必须具有有效的过期/有效性策略和公共的缓存可见性。这可通过使用低级别的 <b>OutputCache</b> API 或高级别的 <b>@ OutputCache</b> 指令来实现。

启用输出缓存后,当发出对页的第一个 <b>GET</b> 请求时创建一个输出缓存项。随后的 <b>GET</b> 或 <b>HEAD</b> 请求由该输出缓存项服务,直到该缓存请求过期。
<p>
输出缓存还支持缓存的 <b>GET</b> 或 <b>POST</b> 名称/值对的变体。
<p>
输出缓存遵循页的过期和有效性策略。如果某页位于输出缓存中,并且有一个过期策略标记指示该页自缓存起 60 分钟后过期,则在 60 分钟后将该页从输出缓存中移除。如果此后接收到另一个请求,则执行页代码,并且可以再次缓存该页。这种过期策略称为绝对过期,即页在某个确定的时间之前有效。

<p>
下面的示例说明用 <b>@ OutputCache</b> 指令输出缓存响应的简单方法。此示例仅显示生成响应的时间。若要查看输出缓存的运行情况,请调用该页并注意生成响应的时间。然后刷新该页并注意原来的时间没有更改,表明输出缓存正在为第二个响应服务。
<p>

<p>
<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/CS/outputcache1.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache1.src"
  Icon="/quickstart/aspplus/images/outputcache1.gif"
  Caption="C# Outputcache1.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/VB/outputcache1.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache1.src"
  Icon="/quickstart/aspplus/images/outputcache1.gif"
  Caption="VB Outputcache1.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/JS/outputcache1.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache1.src"
  Icon="/quickstart/aspplus/images/outputcache1.gif"
  Caption="JScript Outputcache1.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>
<p>
下面的指令在响应时激活输出缓存:
<div class="code"><pre>
&lt;%@ OutputCache Duration="60" VaryByParam="none"%&gt;
</pre></div>
此指令仅指示页应缓存 60 秒,而且页不随任何 <b>GET</b> 或 <b>POST</b> 参数改变。在该页仍被缓存时接收到的请求由缓存服务。60 秒后,从缓存中移除该页;将显式处理下一个请求并再次缓存页。
<p>
当然,在上例中,输出缓存几乎没有省去任何工作。下面的示例显示相同的输出缓存技术,但查询一个数据库并将结果显示在网格中。
<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/CS/outputcache2.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache2.src"
  Icon="/quickstart/aspplus/images/outputcache2.gif"
  Caption="C# Outputcache2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/VB/outputcache2.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache2.src"
  Icon="/quickstart/aspplus/images/outputcache2.gif"
  Caption="VB Outputcache2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/JS/outputcache2.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache2.src"
  Icon="/quickstart/aspplus/images/outputcache2.gif"
  Caption="JScript Outputcache2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
在最后的示例中,对应用程序做了轻微的修改,使用户可以有选择地查询各个州的作者。此示例说明如何使用 <b>@ OutputCache</b> 指令的 <b>VaryByParam</b> 属性,缓存随查询字符串中的名称/值对值变化的请求。
<div class="code"><pre>
&lt;%@ OutputCache Duration="60" VaryByParam="state" %&gt;
</pre></div>
对于数据集中的每个州,都有一个将所需的州作为查询字符串的一部分进行传递的链接。应用程序然后构造合适的数据库查询,并显示仅属于选定州的作者。
<p>
注意,当您第一次单击给定州的链接时,它在页的底部生成一个新的时间戳。此后,每当在一分钟内重新提交对该州的请求时,都会得到原来的时间戳,表示该请求已被缓存。
<p>
<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/CS/outputcache3.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache3.src"
  Icon="/quickstart/aspplus/images/outputcache3.gif"
  Caption="C# Outputcache3.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/VB/outputcache3.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache3.src"
  Icon="/quickstart/aspplus/images/outputcache3.gif"
  Caption="VB Outputcache3.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/cache/JS/outputcache3.aspx"
  ViewSource="/quickstart/aspplus/samples/cache/outputcache3.src"
  Icon="/quickstart/aspplus/images/outputcache3.gif"
  Caption="JScript Outputcache3.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
应用程序若要更多地控制与缓存相关的 HTTP 标头,可使用 <b>System.Web.HttpCachePolicy</b> 类提供的功能。下面的示例显示等效于上例中使用的页指令的代码。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
</Tab>

<Tab Name="VB">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
</Tab>

<Tab Name="JScript">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
</Tab>

</Acme:TabControl><p>
<p>
若要使之成为变化的过期策略(即每次请求页时都重新设置过期时间),请按以下代码所示来设置 <b>SlidingExpiration</b> 属性。
<p><Acme:TabControl runat="server">
<Tab Name="C#">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetSlidingExpiration(true);
</Tab>

<Tab Name="VB">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60))
Response.Cache.SetCacheability(HttpCacheability.Public)
Response.Cache.SetSlidingExpiration(True)
</Tab>

<Tab Name="JScript">
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetSlidingExpiration(true);
</Tab>

</Acme:TabControl><p>

<p>
<b>注意:</b>启用变化的过期后 (<b>SetSlidingExpiration(true)</b>),对原服务器的请求总是会生成一个响应。在下游缓存可满足客户端请求(缓存中的内容尚未过期)而无须从原服务器请求内容的情况下,使用变化的过期时间是很有用的。

<p>
从 ASP 移植过来的应用程序可能已用 ASP 属性设置了缓存策略;例如:
<p><Acme:TabControl runat="server">
<Tab Name="C#">
Response.CacheControl = "Public";
Response.Expires = 60;
</Tab>

<Tab Name="VB">
Response.CacheControl = "Public"
Response.Expires = 60
</Tab>

<Tab Name="JScript">
Response.CacheControl = "Public";
Response.Expires = 60;
</Tab>

</Acme:TabControl><p>
这些属性受 ASP.NET 的支持,并且具有同已显示的其他示例相同的作用。


<h4>本节小结</h4>
<ol>
<li>输出缓存技术缓存由 ASP.NET 页生成的内容。
<li>除非页具有有效的过期时间或有效性策略和公共的缓存可见性,否则不将其放入输出缓存。
</ol>
<!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -