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

ASP.NET 2.0緩存技術探討

編輯:.NET實例教程
本文介紹通過緩存來提高網頁的執行效率。

  1.       ASP.Net Output Caching

  當一個網頁頻繁被訪問的時候,我們可以通過把整個網頁緩存來提高執行效率。這樣作的優點是,當用戶再次訪問這個網頁的時候,被格式化好的Html會被直接送顯。

  為什麼會存在這種效果呢?我們通過ASP.NET的基本運行機制來解釋這個問題。ASP.Net是一個動態的服務器,當用戶從客戶端提供一個請求的時候,那麼服務端的IIS接受到請求,然後根據用戶的提示執行相應的代碼。執行代碼之後生成一個結果。這個結果會被緩存成一個HTML放在Server端,然後通過響應用戶的Request將這個HTML傳送到客戶端。在這之中我們發現,很多時候,用戶的請求實際上並沒有多大的變化,可能請求的都是相同的內容。這時候執行一次代碼的成本就會相當的高。既然我們已經生成了一個HTML,我們何必要在重新執行一次代碼呢?我們直接把Html送顯就可以了。

  l         Output Cache是一項非常有效的增強訪問性能的技術,由於IIS的一些特性,默認情況下Output Cache是打開的,但是要對一些請求進行緩存,還需要開發者進行定制。

  l         定制Output Caching

  對於Output Caching的定制,我們有兩種方法,一種是基於底層的API技術,一種是基於高層的@Output Caching,一旦Output Caching被定制過,那麼這個網頁就會在第一次被訪問的時候生成cache,直到請求過期為止。

  我們著重點是使用高層的@Output Caching標簽來設置,因為API技術的編程難度比較大,和ASP.Net快速編程理念不相符。

  l         代碼示例:通過使用Output Cache定義一個緩存頁,顯示當前時間,大家可以看到,當這個頁面被緩存之後,刷新時,當前時間顯示不發生變化。

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString();
    }
   </script>//head以前。
    protected void Page_Load(object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString();
}
   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.ASPx.cs" Inherits="_Default" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>

  l         示例講解

  在這個頁面中<%@ Output Cache Duration = “60” VaryByParam = “none”%>

  這段話定義了頁面將要被緩存,並且,其緩存時間為60秒,並在一個頁面被緩存之後,通過定義VaryByParam屬性,它不會因為request接受的參數而改變,只有在60秒之後,頁面自動清除緩存,此時,第一個訪問提供了新的緩存。

  l         代碼示例:數據訪問的小示例,相對顯示當前數據示例,這個示例更能顯示緩存頁之後刷新的性能優勢。

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString();
    }
   </script>//head以前。
    protected void Page_Load(object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString();
}
   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.ASPx.cs" Inherits="_Default" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>//最上面

  l         由參數改變緩存內容

  有些時候我們需要根據用戶的請求來生成頁面,但是用戶的請求只有有限的幾種組合,這個時候就可以根據用戶請求來生成幾種緩存頁面,來進行緩存。

  l         代碼示例:接受參數示例,根據用戶選擇不同的Name顯示不同的數據庫內容。

  最開始部分:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.ASPx.cs" Inherits="_Default" %>
<%@ OutputCache Duration="60" VaryByParam="Name" %>
<script runat="server">
 
    protected void Page_Load(object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString("G");
    }
 
</script>

  Body內容:

        <span >Using the Output Cache</span><b>Authors by Name:</b>
        <table cellpadding="3" cellspacing="0" rules="all" MARGIN: 0px">            border-bottom-color: black; width: 700px; border-top-color: black; border-collapse: collapse;
            background-color: #aaaadd; border-right-color: black">
            <tr>
                <td>
                    <a href="Default.ASPx?Name=李陽">1</a></td>
                <td>
                    <a href="Default.ASPx?Name=陳勝">2</a></td>
                <td>
                    <a href="Default.ASPx?Name=夏秘密">3</a></td>
                <td>
                    <a href="Default.ASPx?Name=范玲玲">4</a></td>
            </tr>
        </table>
        <br />
        <ASP:GridView ID="GridVIEw1" runat="server" DataSourceID="SqlDataSource1">
        </ASP:GridVIEw>
        <ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:qimuConnectionString %>"
            SelectCommand="SELECT * FROM [tab1] WHERE ([Name] = @Name)">
            <SelectParameters>
                <ASP:QueryStringParameter Name="Name" QueryStringFIEld="Name" DefaultValue="李陽" />
            </SelectParameters>
        </ASP:SqlDataSource>
        <br />
        <em>Last generated on:</em>
        <asp:Label ID="TimeMsg" runat="server"></ASP:Label>&nbsp;

  顯示效果:

  Using the Output CacheAuthors by Name:

  1

  2

  3

  4

  ID

  Name

  Sex

  1

  李陽

  男

  Last generated on: 2009-5-10 0:29:13 

  l         接受參數示例解說

  關鍵語句<%@ Output Cache Duration = “60” VaryByParam = “Name”%>

  上面顯示一個數據庫查詢示例,並在頁面下端放置一個訪問的當前時間顯示,可以清楚的看到,對於每個不同的參數,一分鐘之內的訪問會得到同一個時間戳,這表明用戶在這個時間內訪問的視同一個cache。

  注意:不足是在60秒以內數據庫做出改變,不能顯示更新的顯示,需要處理這個問題還需要其他的設置。

  l         硬盤Output Cache

  默認情況下,Output Cache會被緩存到硬盤上。我們可以通過修改diskcacheenable的屬性來設置其是否緩存,還可以通過在web config裡配置緩存文件的大小。

  在使用程序的時候,我們常用內存緩存和交換區緩存,硬盤緩存技術我們可能用的不是很多,因為覺得硬盤速度慢,或者交互起來有問題。實際上,由於服務器現在占用內存都比較多,尤其是大型的應用。所以在IIS服務默認是把硬盤服務是打開的。

  l         使用DiskOutput Cache示例:

<%@ OutputCache Duration="3600" VaryByParam="name" DiskCacheable="true" %>
Web.Config文件中,
<configuration>
     <aPPSettings/>
     <system.web>
    <caching>
      <outputCache>
        <diskCache enabled="true" maxSizePerApp="2"(2M) />
      </outputCache>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="CacheFor60Seconds" duration="60" />
        </outputCacheProfiles>
      </outputCacheSettings>
      <!--
              <sqlCacheDependency enabled="true" pollTime="1000" >
                   <databases>
                       <add name="PubsDB" connectionStringName="pubsConnectionString" />
                   </databases>
              </sqlCacheDependency>
              -->
    </caching>
     </system.web>
</configuration>

  設置DiskOutput屬性。

  指定硬盤緩存時,指定時間要相應的大一些。硬盤訪問速度相對慢一點。(VS 2005正式版已經刪除了這一個功能,汗!)

  l         回調緩存

  通過設置回調緩存機制,可以針對每個請求在頁面中插入動態的部分,以彌補單獨使用靜態緩存的不足。

  代碼示例:

  ü         回調緩存示例

<%@ Page Language="VB" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
 
<script runat="server">
    Shared Function GetCurrentDate(ByVal context As HttpContext) As String
        Return Now.ToString()
    End Function
</script>
 
<Html>
<head id="Head1" runat="server">
    <title>Post Cache Substitution</title>
</head>
<body>
    <form id="form1" runat="server">
        <h4>
            This page uses post cache substitution to insert a dynamic value into a cached page.</h4>
        <p>
            Time:
            <%= DateTime.Now.ToString() %>
        </p>
        <p>
            <b>Real Time:
                <ASP:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDate" />
            </b>
        </p>
    </form>
</body>
</Html>

  ü         通過API實現回調緩存

<%@ Page Language="VB" %>
<%@ OutputCache Duration="60" VaryByParam = "none" %>
 
<script runat="server">
 
Shared Function GetCurrentDate(context As HttpContext) As String
 
    return DateTime.Now.ToString()
End Function
 
</script>
 
<Html>
<head id="Head1" runat="server">
    <title>Post Cache Substitution</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <b>This page uses post cache substitution to insert a dynamic value into a cached page.</b>
    <br /><br />
    Time: <%= DateTime.Now.ToString() %>
    <br /><br />
    <b>  
    Real Time: <% Response.WriteSubstitution(New HttpResponseSubstitutionCallback(AddressOf GetCurrentDate)) %>
    </b>
    </div>
    </div>
    </form>
</body>
</Html>

  ü         通過使用SubStitution來實現緩存

  l         使用API定制緩存

  ü         如果需要對緩存進行更詳細的設置,可以通過設置System.Web.HttpCachePolicy屬性來進行配置下面這個語句和我們<%@ Output Cache Duration = “60” VaryByParam = “none”%>完全一樣

  ü         Response.Cache.SetExpires(Now.AddSeconds(60))

   Response.Cache.SetCacheability(HttpCacheability.Public)

  2.       Page Fragment Caching

  l         作為Output的緩存的附加功能,還提供一種緩存技術,專門用於緩存用戶控件或者網頁中的一部分東西。可以指定沒一部分或者某一個區域不被緩存。

  l         在頁面中,指定返回參數,來決定控件被緩存的部分。使用語句VaryByparam語句指定控件更具參數來改變。

  l         示例:通過返回參數改變緩存內容示例

  用戶控件頁面設置:

<%@ Control Language="vb" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>

  調用控件頁面設置:

<%@ Register TagPrefix="Acme" TagName="DataControl" Src="datactrl.ascx" %>

  Body部分:

     <h3>
        <font face="Verdana">Fragment Caching</font></h3>
    <Acme:DataControl runat="server" />
    <br>
    <i>頁面最後被訪問於:</i>
    <ASP:Label ID="TimeMsg" runat="server" />

  l         接受控件傳參數修改

  緩存用戶控件同樣還可以使用控件作為參數來源。通過指定控件作為緩存控件的參數來源,可以達到緩存控件數據的目的。

  示例:通過控件參數改變緩存內容示例

  用戶控件頁面設置:

<%@ Control Language="VB" ClassName="FragCtrlwithAPI" %>
<%@ OutputCache Duration="60" VaryByControl="pickstate" %>
 
<script runat="server">
    Private duration As TimeSpan
   
    Sub Page_Load(ByVal sender As Object, ByVal E As EventArgs)
        If (pickstate.SelectedValue = "CA") Then
            duration = New TimeSpan(0, 0, 10)
            CachePolicy.Duration = duration
        End If
    End Sub
 
    Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
        Label1.Text = Now.ToString("G")
        Label2.Text = Now.Add(CachePolicy.Duration).ToString("G")
    End Sub
</script>
 
<div >
    <ASP:DropDownList ID="pickstate" runat="server" AutoPostBack=true>
        <ASP:ListItem Text="CA" Value="CA" />
        <ASP:ListItem Text="UT" Value="UT" />
        <ASP:ListItem Text="MD" Value="MD" />
        <ASP:ListItem Text="OR" Value="OR" />
        <ASP:ListItem Text="MI" Value="MI" />
        <ASP:ListItem Text="TN" Value="TN" />
    </ASP:DropDownList>
    <ASP:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>"
        SelectCommand="SELECT [au_id], [au_lname], [au_fname], [phone], [address], [city], [state], [zip], [contract] FROM [authors] where state=@state"
        ProviderName="System.Data.SqlClIEnt">
        <SelectParameters>
            <ASP:ControlParameter ControlID="pickstate" DefaultValue="CA" Name="state" PropertyName="SelectedValue" />
        </SelectParameters>
    </ASP:SqlDataSource>
    <ASP:GridView ID="GridVIEw1" runat="server" DataSourceID="sqldatasource1" />
    <p>
       控件被建立於<ASP:Label ID="Label1" runat="server" Text="Label"/><br />
        控件被銷毀<ASP:Label ID="Label2" runat="server" Text="Label"/><br />     
    </p>
</div>

  調用控件頁面設置:

<%@ Register Src="datactrlnew.ascx" TagName="FragCtrl" TagPrefix="acme" %>

  Body部分:

            <acme:FragCtrl ID="FragCtrl1" runat="server" />

   當前

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