asp.net Cache的应用

 

一、页输出缓存

1、页面输出缓存的几种形式

①在.aspx文件中添加指令

 

<%@ OutputCache Duration="60" VaryByParam="None" >

②还可在配置文件里配置缓存名称,然后在页面调用配置文件的缓存名称

步骤1、在配置文件中首先增加caching节

 

代码
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="testCache" duration="60" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>

</caching>

 

步骤2、在.aspx文件中添加指令

 

<%@ OutputCache CacheProfile="testCache"%>

 

 

如果在aspx文件的指令中修改参数设置,会替换web.config的配置;如<%@ OutputCache CacheProfile="testCache" varyByParam=”ID”%>页面会根据ID的变化更新缓存。

③用编程的方式

Response.Canche.SetExpires(DateTime.Now.AddSeconds(3));
Response.Canche.SetCacheabiliy(HttpCacheability.Public);
Response.Canche.SetValidUntilExpires(
true);

  

2、实现部分缓存(不缓存)

①使用用户控件

如果页面需要缓存页面的一部分,其他部分及时刷新。可以把需要缓存的部分做成用户控件,在用户控件里设置缓存。

注意:当用户控件设置的缓存时间为60秒,调用页面缓存时间为100秒。这时,用户控件缓存时间会以时间长的为准。及缓存100秒。

②使用Substitution控件

如果整个页面都需要缓存,只有一部分需要实时刷新。那么实时刷新的部分可以用Substitution控件实现。

步骤1、在需要实时刷新的地方i添加Substitution 控件。

MethodName:获得数据的方法名。该方法名必须是静态方法,可以转递HttpContext参数,返回类型为string。

 

<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentTime"/>

 

 

步骤2、声明GetCurrentTime方法。

 

protected static string GetCurrentTime(HttpContext context)
{
return DateTime.Now.ToString();
}

 

 

③AdRotator控件、

这个控件永远都是不缓存的

 

3、@OutputCache指令中的主要属性

Duration

页或用户控件进行缓存的时间(以秒计)。在页或用户控件上设置该属性为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。

Note注意

这是必选属性。如果未包含该属性,将出现分析器错误。

Location

OutputCacheLocation 枚举值之一。默认值为 Any

Any
输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。此值对应于 HttpCacheability.Public 枚举值。

Client
输出缓存位于产生请求的浏览器客户端上。此值对应于 HttpCacheability.Private 枚举值。

Downstream
输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。这包括代理服务器和发出请求的客户端。

None
对于请求的页,禁用输出缓存。此值对应于 HttpCacheability.NoCache 枚举值。

Server
输出缓存位于处理请求的 Web 服务器上。此值对应于 HttpCacheability.Server 枚举值。

ServerAndClient
输出缓存只能存储在源服务器或发出请求的客户端中。代理服务器不能缓存响应。此值对应于 HttpCacheability.PrivateHttpCacheability.Server 枚举值的组合。

 

Note注意
包含在用控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。

CacheProfile

与该页关联的缓存设置的名称。这是可选属性,默认值为空字符 ("")。

Note注意

包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

NoStore

一个布尔值,它决定了是否阻止敏感信息的二级存储。

Note注意

包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。将此属性设置为 true 等效于在请求期间执行以下代码:

 Response.Cache.SetNoStore();

Shared

一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为 false。有关更多信息,请参见备注部分。

Note注意

包含在 ASP.NET 页(.aspx 文件)中的 @ OutputCache 指令不支持此属性。

SqlDependency

标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。请注意,SqlCacheDependency 类监视输出缓存所依赖的数据库中的表,因此当更新表中的项时,使用基于表的轮询时将从缓存中移除这些项。将通知(在 Microsoft SQL Server 2005 中)与 CommandNotification 值一起使用时,最终将使用 SqlDependency 类向 SQL Server 2005 服务器注册查询通知。

Note注意

SqlDependency 属性的 CommandNotification 值仅在网页 (.aspx) 中有效。用户控件只能将基于表的轮询用于 @ OutputCache 指令。

VaryByCustom

表示自定义输出缓存要求的任意文本。如果赋予该属性的值为 browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入自定义字符串,则必须在应用程序的 Global.asax 文件中重写 GetVaryByCustomString 方法。

VaryByHeader

分号分隔的 HTTP 标头列表,用于使输出缓存发生变化。将该属性设为多标头时,对于每个指定标头组合,输出缓存都包含一个不同版本的请求文档。

Note注意

设置 VaryByHeader 属性将启用在所有 HTTP 1.1 版缓存中缓存项,而不仅仅在 ASP.NET 缓存中进行缓存。用户控件中的 @ OutputCache 指令不支持此属性。

VaryByParam

分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与随 GET 方法属性发送的查询字符串值对应,或与使用 POST 方法发送的参数对应。将该属性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档。可能的值包括 none、星号 (*) 以及任何有效的查询字符串或 POST 参数名称。

Caution note警告

在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByControl 属性。如果没有包含它,则发生分析器错误。如果不希望通过指定参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变输出缓存,请将属性设置为星号 (*))。

VaryByControl

一个分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的 ASP.NET 服务器控件的 ID 属性值。有关更多信息,请参见缓存 ASP.NET 页的某些部分

Note注意

在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。

 

二、文件依赖缓存

文件发生更改时从输出缓存中移除某一项。就是说文件改了以后缓存立即失效。

 

实现代码

 

代码
string filename = Server.MapPath(".\\7788.xml");
Response.AddFileDependency(filename);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(
1000));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Write(DateTime.Now.ToString());

 

 

三、Sql server依赖的缓存

当表数据发生改变就清除缓存。

1、依赖数据表缓存页面

步骤1、修改Global.asax文件

 

代码
void Application_Start(object sender, EventArgs e)
{
SqlCacheDependencyAdmin.EnableNotifications(ConfigurationManager.ConnectionStrings[
"b2cshop"].ToString());

//test是表的名字
SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["b2cshop"].ToString(),"test");

}

 

 

步骤2、配置web.config文件

 

代码
<connectionStrings>
<add name="b2cshop" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI; Initial Catalog=b2cshop;User ID=sa;password=123456"/>
</connectionStrings>

<caching>
<sqlCacheDependency>
<databases>
<add connectionStringName="b2cshop" pollTime="3600" name="B2Cshop"/>
</databases>
</sqlCacheDependency>
</caching>

 

 

步骤3、apsx 也页中添加outputcache指令

SqlDependency="B2Cshop:test" ,B2Cshop为web.config文件中配置的名字,test为具体表名。

 

<%@ OutputCache SqlDependency="B2Cshop:test" Duration="360000" VaryByParam="none"%>

 

 

注意:当VaryByParam参数不为none是,页面也会依据参数变化,更新缓存。

2、依赖查询结果缓存对象

步骤1、查看数据库;是否启动通知转递服务

 

SELECT DATABASEpRoPERTYEX('B2Cshop','IsBrokerEnabled') --开启 0 为开启

 

 

步骤2、启动通知转递服务

 

ALTER DATABASE B2Cshop SET ENABLE_BROKER

 

 

步骤3、修改Global.asax文件

 

代码
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
SqlDependency.Start(ConfigurationManager.ConnectionStrings["b2cshop"].ToString());
}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
SqlDependency.Stop(ConfigurationManager.ConnectionStrings["b2cshop"].ToString());
}

 

 

步骤4、添加SqlCacheDependency依赖代码。当dbo.test表的数据发生改变时,清空缓存。

注意:

a). 必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test。
b). 必须明确设置所访问数据库列名称,不能使用“*”。
c). 必须保证不是聚合函数。如COUNT、MAX等。

 

代码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataTable dt
= HttpContext.Current.Cache["dt"] as DataTable;
if (dt == null)
{
string connString = ConfigurationManager.ConnectionStrings["b2cshop"].ToString();
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();

SqlCommand cmd
= new SqlCommand("select id,username,score from dbo.test", conn);

SqlCacheDependency scd
= new SqlCacheDependency(cmd);

SqlDataAdapter sda
= new SqlDataAdapter(cmd);

dt
= new DataTable();

sda.Fill(dt);
HttpContext.Current.Cache.Insert(
"dt", dt, scd);

}
}

GridView1.DataSource
= dt;
GridView1.DataBind();
}
}

 

 cache应用源码下载地址

https://files.cnblogs.com/alphacn/DoNetCache.rar

 

 

posted @ 2010-08-02 16:06  希腊字符  阅读(654)  评论(0编辑  收藏  举报