页面缓存『转』

系统 1688 0

一般情况下,WEB页面都会在Internet临时文件夹中有一个临时文件.
我在操作IE时会出现这种情况:
假如说有一个页面Page1.aspx,在我第一次访问后,它会在我的Internet临时文件夹里有一个Page1.aspx文件生成.之后,如果我改了Page1.aspx的数据后再次访问该页面,发现IE并没有对这个Page1.aspx的数据进行更新,反而打开的是我第一次访问的页面.为什么会这样,是因为IE自动(默认)调用了Internet临时文件夹里有一个Page1.aspx文件,而不是重新下载新的Page1.aspx.
怎样能让IE自动重新下载新的Page1.aspx呢?
一种方法是对Internet选项进行设置.
Internet选项-->常规-->Internet临时文件中"设置"-->每次访问此页时检查.
这种设置时最好同时删除临时文件.
这种方法是让客户自己设置自己的浏览器,如果客户忘记了设置,那么,新的页面总是下载不到本地.这时,客户会怎样认为呢?("肯定是程序的错!"其实也不是程序的错,但是用程序完全可以解决这个问题)
第二种方法:用程序自己来让页面自动下载.
这种方法实际上是让页面不保存到Internet临时文件夹中,每次访问页面都会让浏览器下载页面.
只要在aspx.cs代码的Page_Load事件中加上

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache);

即可.

不防你试试.在不加这句时,你打开页面,Internet临时文件夹里会有一个页面文件,而加了,就会没有了.
不过,像aspx文件中如果有图片文件或js文件,那还是会下载到Internet临时文件夹的.


-------------------------------------------------------------------------------------------------------------------


页面缓存

使用 OutputCache 指令。

<%@ OutputCache Duration="3600"

                Location="Any"

                VaryByCustom="browser"

                VaryByParam="RequestID" %>

其中 Duration VaryByParam 特性是必须的。

 

Location 控制页面缓存的位置

Location

含义

Any

默认值。意味着页面的输出可以缓存在客户端浏览器,缓存在任何“下游”的客户端(如代理服务器),或缓存在 Web 服务器本身

Client

指明输出缓存只能存储在发出请求的客户端(即浏览器)的本地缓存中

Downstream

指明输出缓存能存储在任何支持 HTTP1.1 缓存的设备(如代理服务器)中

Server

指明输出缓存将存储在 Web 服务器上

None

指明该页面禁用输出缓存

 

Duration 允许我们控制页面在缓存中生存的时间(单位是秒)

 

VaryByParam 允许我们缓存页面的不同版本。在上面的例子中, VaryByParam 设为了 RequestID ,所以 ASP.NET 使用 RequestID 参数的不同值,这些值或者是在 HTTP GET 的查询字符串中传入,或者是在 HTTP POST 的参数中传入。可以通过检查 RequestID 参数的值让应用程序区分不同的用户;通过在页面的 OutputCache 指令中放置 VaryByParam "RequestID" ,可以让 ASP.NET 为每个用户缓存页面的不同版本。

如果不想根据参数的值缓存页面的不问版本,那么只要把 VaryByParam 设为 none

也可以要求 ASP.NET 为每个可能的参数组合缓存页面的一个版本。为此,可把 VaryByParam 设为 *

 

VaryByHeader VaryByCustom 特性与 VaryByParam 的相似之处在于,它们允许指定何时应创建页面新的缓存版本。

VaryByHeader 允许我们根据由分号分隔的 HTTP 头的列表末缓存页面的不向版本。

VaryByCustom 当设为 browser 时,允许我们根据浏览器的名称和主版本信息缓存不同版本。也可以把它设为一个自定义方法的名称,从而实现我们自己的逻辑,控制缓存的版本。

 

片断缓存

可以利用用户控件将页面分段,在 ascx 文件中写入缓存的语句,而不在 aspx 文件中写缓存语句,这样 ASP.NET 就可以只缓存 ascx 片断的输出了。一般像页眉或页脚基本上都是一样的,就不需要重新加载。但是如果其中有动态变化的数据就不能对其进行缓存,因为一旦被缓存后程序就不会再创建它的实例来更新数据显示,只有等到生存期过期才行,所以对于这种情况就不适于用页面片断缓存。

注意:

一、注意片段缓存不支持 Location 特性;缓存页面片段惟一合法的地方是 web 服务器。这是因为片段缓存在 ASP.NET 中是新的功能,所以浏览器和代理服务器不支持。

二、片段缓存有另外一个在页面缓存中没有的特性—— VaryByControl VaryByControl 特性允许指定一个由分号分隔的字符串列表,代表用户控件内使用的控件的名称; ASP.NET 将针对值的每个不同的组合生成用户构件的一个缓存版本。

 

数据缓存

低级 API Cache 类,它位于 ASP.NET 中的 System.web.Caching 命名空间,可以用它缓存生成很耗费资源的数据。 Cache 类的使用和 Session Application 对象一样简单。每个应用程序只有一个 Cache 对象——这意味着使用 Cache 对象存储在缓存中的数据是应用程序级别的数据。使事情更为简单的是, Page 类的 Cache 属性使应用程序的 Cache 对象实例能在代码中使用。

通过 Cache 对象缓存的数据存储在应用程序的内存中。这意味着该数据的生存期不会超过应用程序的重启 ( 事实上,这和存储在 Application Session 对象中的数据一样,除非使用 StateService SQL State 会话模式存储 Session 数据 )

具体的使用和语法与 Session Application 一样。转换回来的时候需要注意对其进行相应类型的强制类型转换。

 

这不是在 ASP.NET 缓存中添加缓存项的惟一方式。 Cache 对象有两个方法 Insert() 方法和 Add() 方法,它们灵活性更高。它们的用法近似,但稍有不同:

Insert() 方法用于覆盖 ASP.NET 缓存中现有的缓存项。

Add() 方法只用于在 ASP.NET 缓存中添加新的缓存项 ( 如果用它覆盖现有的缓存项,则会失败 )

每个方法都有 7 个参数,而且两个方法的参数相同。

在缓存某一项时,可以指定它的相关性,告诉 ASP.NET 该缓存项在缓存中一直保留到某个事件发生时为止。

相关性值

含义

CacheDependency

允许指定一个文件或缓存键。如果文件发生变化,对象就被删除。如果缓存键发生变化,对象也被删除。

DateTime

这是一个 DataTime 值,指明缓存数据过期的时间(绝对过期时间)

TimeSpan

这是一个时间间隔,指明缓存数据在上一次访问后可以在缓存中保留多长时间(弹性过期时间)

使用 CacheItemPriority 来指定缓存数据的优先级,以便在缓存被填满的时候删除那些优先级低的数据。

优先级值

含义

High

设为此优先级的缓存项是最不可能在内存不足时被删除的

AboveNormal

设为此优先级的缓存项比优先级为 Normal 或以下的缓存项更优先保留

Normal

设为此优先级的缓存项比优先级为 BelowNormal Low 的缓存项更优先保留

BelowNormal

这是倒数第二级的优先级;设为此优先级的缓存项只比优先级设为 Low 的缓存项更优先保留

Low

设为此优先级的缓存项是最有可能在内存不足时被删除的

Default

缓存项的优先级的默认值是 Normal

NotRemovable

当缓存项设为此优先级时,是在告诉 ASP.NET 即使是内存不足,也不要从缓存中删除它

DateTime dt = new DateTime(DateTime . Now . Year, 12 , 31 );

Cache . Add( "MembersDataSet" ,dsMembers, null ,

dt,TimeSpan . Zero,

CacheItemPriority . Normal, null );

第一个参数是引用缓存对象的键,第二个参数是要缓存的对象。第三个参数是 null( 表明没有相关性 )

第四和第五个参数是绝对的过期时间和弹性的过期时间。这里,我们指定缓存应在当前年份的最后一天过期 (dt) 。我们想指定没有弹性的过期时间,所以第五个参数使用 TimeSpan.Zero 。第六个参数使用 System.Web.Caching.CacheItemPriority 枚举中的一个值,把优先级设为 Normal

 

指定一个 5 分钟的弹性过期时间,没有指定绝对过期时间

Cache . Add( "MembersDataSet" ,dsMembers, null ,

                DateTime . MaxValue,TimeSpan . FromMinutes( 5 ),

            CacheItemPriority . Normal, null );

 

添加一个相关性。在这个例子中,过期时间也取决于一个文件的修改,即 test.xml 文件:

CacheDependency dep = new CacheDependency( @"C:\test.xml" );

Cache . Add( "MembersDataSet" ,dsMembers,dep,

                DateTime . MaxValue,TimeSpan . FromMinutes( 5 ),

            CacheItemPriority . Normal, null );

 

过期时间取决于缓存中另一项的修改:

String[] dependencyKeys = new String[ 1 ];

dependencyKeys[ 0 ] = "MembersChanged" ;

CacheDependency dependency = new CacheDependency( null , dependencyKeys);

Cache . Add( "MembersDataSet" ,dsMembers,dependency,

                DateTime . MaxValue,TimeSpan . Zero,

            CacheItemPriority . Normal, null );

 

最后一个参数是 CacheItemRemovedCallback 类型的,允许我们在缓存项从缓存中删除时要求通知,可以编写一个自定义的方法 ( 像这里的 ItemRemovedCallback() 方法 ) ,然后在第 7 个参数中指定该方法:

        public void ItemRemovedCallback(String key, Object value , CacheItemRemovedReason reason)

        {

        }

 

Cache . Add( "MembersDataSet" ,dsMembers,dependency,

                DateTime . MaxValue,TimeSpan . FromMinutes( 5 ),

            CacheItemPriority . Normal,

new CacheItemRemovedCallback( this . ItemRemovedCallback));

第一个参数是在缓存中存储缓存项时使用的键,第二个是存储的对象本身,第三个是缓存项删除的原因。

 

页面缓存『转』


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论