ASP.NET 缓存

页面输出缓存

在页面上添加<%@ OutputCache Duration=“10” VaryByParam=“none”%>标签就可以启用页面缓存。Duration表示缓存时间;VaryByParam表示页面将根据使用 POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。例:

Test.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="WebApplication1.Test" %>

<%@ OutputCache Duration="10" VaryByParam="none"%>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Label ID="lblShowTime" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

Test.aspx.cs:
protected void Page_Load(object sender, EventArgs e) {

            if (!IsPostBack) {

                this.lblShowTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            }

        }
View Code

如果不加 <%@ OutputCache Duration=“10” VaryByParam=“none”%>,则每次刷新页面时,页面上显示的时间都会改变。而加了后,10秒发生一次变化。

如果需要根据参数来更新内容,比如,http://localhost:45724/Test.aspx?id=1,那么只需要把VaryByParam里面的属性值改成id即可。例如,<%@ OutputCache Duration=“10” VaryByParam=“id”%>.多个参数用分号隔开即可,VaryByParam=”id;action”。

页面局部缓存

1.片段缓存

把需要缓存的信息包含在一个用户控件内,然后将该用户控件标记为可缓存的。例:

TestWebUserControl1.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestWebUserControl1.ascx.cs" Inherits="WebApplication1.TestWebUserControl1" %>
<%@ OutputCache Duration="10" VaryByParam="none" %>
<%=DateTime.Now %> 
 
Test.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="WebApplication1.Test" %>

<%--<%@ OutputCache Duration="10" VaryByParam="none"%>--%>

<%@ Register src="TestWebUserControl1.ascx" tagname="TestWebUserControl1" tagprefix="uc1" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <div>
    当前页面的:<%=DateTime.Now %>    
    </div>
    <div>
    用户自定义控件的:<uc1:TestWebUserControl1 ID="TestWebUserControl1" runat="server" />
    </div>
    </div>
    </form>
</body>
</html>
View Code

当我们不停的去刷新页面时,只有当前页面时间发生变化,而用户自定义控件的时间要隔60后改变一次。

2.缓存后替换

与片段缓存相反,对大部分内容进行缓存。例:

Test.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="WebApplication1.Test" %>

<%--<%@ OutputCache Duration="10" VaryByParam="none"%>--%>

<%@ Register src="TestWebUserControl1.ascx" tagname="TestWebUserControl1" tagprefix="uc1" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <div>
    当前页面的:<%=DateTime.Now %>    
    </div>
    <div>
    用户自定义控件的:<uc1:TestWebUserControl1 ID="TestWebUserControl1" runat="server" />
    </div>
        <div>
            缓存替换-控件缓存:<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentTime" />
        </div>
    </div>
    </form>
</body>
</html>
Test.aspx.cs:
Public static string GetCurrentTime(HttpContext context) {

            return DateTime.Now.ToString();
        }
View Code

使用Substitution控件必须具备三个条件:1.方法必须定义为静态方法。2. 必须接受HttpContext类型的参数。3. 必须返回String类型的值。

应用程序数据缓存

利用.NET自带的System.Web.Caching程序集下的cache类 .例:

 protected void Page_Load(object sender, EventArgs e) {

                //this.lblShowTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                string CacheKey = "cachetest";
                object objModel = GetCache(CacheKey);//从缓存中获取
                if (objModel == null) {
                    objModel = DateTime.Now;//把当前时间进行缓存
                    if (objModel != null) {
                        int CacheTime = 30;//缓存时间30秒
                        SetCache(CacheKey, objModel, DateTime.Now.AddSeconds(CacheTime), TimeSpan.Zero);//写入缓存
                    }
                }
                lblShowTime.Text = objModel.ToString();
            

        }
        /// <summary>
        /// 获取当前应用程序指定CacheKey的Cache对象值
        /// </summary>
        /// <param name="CacheKey">索引键值</param>
        /// <returns>返回缓存对象</returns>
        public static object GetCache(string CacheKey) {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            return objCache[CacheKey];
        }
        /// <summary>
        /// 设置当前应用程序指定CacheKey的Cache对象值
        /// </summary>
        /// <param name="CacheKey">索引键值</param>
        /// <param name="objObject">缓存对象</param>
        /// <param name="absoluteExpiration">绝对过期时间</param>
        /// <param name="slidingExpiration">最后一次访问所插入对象时与该对象过期时之间的时间间隔</param>
        public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration) {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
        }
View Code

文件缓存依赖

通过更改文件的内容来自动更新缓存。例:

string filePath = "C:\\test.txt";
                        System.Web.Caching.CacheDependency dep = new System.Web.Caching.CacheDependency(filePath);
View Code

改变test.txt里面的内容来更新缓存。

数据库缓存依赖

1. 修改web.config,启用SqlCacheDependency 。

 <caching>
    <sqlCacheDependency enabled="true" pollTime="6000">
      <databases>
        <add name="databasename" connectionStringName="connStr" />
      </databases>
    </sqlCacheDependency>
 </caching>
View Code

2. 为数据库启用缓存依赖

使用C:\\Windows\\Microsoft.NET\\Framework\\[版本]文件夹中aspnet_regsql.exe。

aspnet_regsql -C "data source=127.0.0.1;initial catalog=databasename;user id=sa;password=" -ed -et -t "P_Product"

参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

参数-t后面的字符串是数据表的名字。

3. 在代码中设置缓存

System.Web.Caching.SqlCacheDependency scde = new System.Web.Caching.SqlCacheDependency("数据库", "表名");
View Code

参考:http://www.cnblogs.com/ltp/archive/2009/06/30/1514311.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。