Net学习日记_ASP.Net_高级

页面处理流程-页面生命周期-服务器控件树

 

整页缓存

页面缓存机制

 一句话,浏览器会自动缓存静态网页。

 

数据库缓存依赖

文件缓存依赖

缓存依赖项一变,就写入数据。

 

 

浏览器和服务器基于Http协议的缓存机制

1.浏览器访问 静态页面(Html/图片/Css/Javascript) 那么在浏览器缓存中会保存一个副本;

  1.1  使用get请求:浏览器再使用get请求访问过的静态页面时,浏览器直接读取浏览器缓存的副本;

  1.2  如果强制刷新,那么浏览器就会发送请求报文给服务器,但是,会带上一个浏览器缓存该页面的时间,添加到请求报文中发给服务器。

         那么服务器发现请求报文里有If-Modified-Since时间,则会强制发送一个 304状态码给浏览器,并不读取请求的服务器端静态页面。

2.浏览器访问 动态页面(.aspx/.ashx),服务器会在响应报文中添加一个 Cache-Control:private,那么浏览器读到这个报文命令后,就不会在缓存中保存副本;

   当再次请求这个动态页面的时候,直接发送请求报文给服务器,服务器执行被请求的动态页面的PR方法,生成响应报文发回浏览器(仍包含:Cache-Control:private)。

浏览器请求服务器:

  1.带失效时间:If-Modifed-Since

         1.1  如果时间失效,则创建页面对象,执行页面代码,生成html

         1.2  如果时间未失效,直接返回304,不创建页面对象。

  2.请求中不带失效时间:If-Modifed-Since,直接检查服务器当前页面是否有缓存

          2.1 有,则读取缓存内容,发回浏览器 2.2 没有,创建页面对象,生成html

 

 

 

服务器缓存

1.为动态页面开启服务器缓存

2. 一旦为某个页面开启服务器缓存,服务器为产生响应报文 添加了新命令行:

   2.1  Expires,代表服务器端该页面的缓存失效时间

   2.2  Last-Modified,代表服务器改页面的缓存生成时间

3.当浏览器访问一个 服务器的动态页面的时候,该页面如果在服务器生成了缓存版本,那么服务器就会在响应报文里添加:Expires和Last-Modified。

   那么,当浏览器接收到这个包含Expires和Last-Modified的响应报文后,就会在浏览器端生成一个缓存副本。

     3.1  如果浏览器再次使用get请求服务器这个动态页面,那么浏览器会直接从浏览器缓存中获取这个页面内容。

     3.2  如果浏览器强制(刷新)请求服务器这个动态页面,那么浏览器会发送一个不一样的请求报文,里面包含了一个 If-Modified-Since!

那么,服务器接收到这个请求报文后,会先根据 If-Modified-Since时间和url去服务器缓存池中判断被请求的页面缓存是否已经失效,如果没有失效,直接返回 304状态码给浏览器,让浏览器从自己的缓存中读取页面。

为什么要这样呢?          因为可以介绍响应报文的长度,节约传输时间。

 

 

3.3  但是,如果有其他浏览器再来访问的时候,由于其他浏览器没有接收过Last-Modified,所以发送的请求报文里不带If-Modified-Since,那么服务器就直接前往缓存池中,读取该页面缓存的html代码,并生成响应报文发给这个浏览器,并为这个浏览器也发送 Last-Modified时间。

那么,这个浏览器下次再强制访问时,也会带上If-Modifed-Since了。

 

4.页面缓存,为制定url参数的值 结合 页面路径 生成相同页面但不同的缓存版本

那么服务器就会结合 url+参数id的值 的方式来保存不同的缓存版本了。

 

   如果要根据url里多个参数生成不同缓存版本时,就使用 , 隔开。

<%@ OutputCache Duration="30"  VaryByParam="id,name" %>

 

  如果要根据url里所有的参数生成不同缓存版本时,就是用 * .

   <%@ OutputCache Duration="30" VaryByParam="*" %>

 

5.自定义缓存 Cache

if (Cache.Get("myDog") == null)
{
Dog dog = new Dog() { Name = "Ruiky" };
//添加缓存项
    Cache.Add("myDog", dog, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 3), System.Web.Caching.CacheItemPriority.Normal, CacheItemRemovedCallback);
    Response.Write("保存dog");
}
else
{
    Dog dog = Cache.Get("myDog") as Dog;
    Response.Write("嘿~~~我家的小狗~~~:" + dog.Name + ",死了~~~~");
}

 

缓存的 回调函数,在缓存移除的时候会被调用

/// <summary>
/// 缓存被移出时的回调函数
/// </summary>
public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
    System.IO.File.AppendAllText(Server.MapPath("Log.txt"), "缓存被移出啦:" + key + "=" + value + "移除原因:" + reason.ToString() + "\r\n");
}

 

 

5.1文件缓存依赖

 凡是添加了 依赖对象的缓存键值对,都会在依赖项发生改变的时候,自动被移出!

 

 

 

 

 

1.缓存(Cache)和Session的异同:

   缓存和Session都存在服务器端。

   但是 Session在服务端会为当前用户分配一个SessionID并以Cookie的方式发回给浏览器,只有带这个SessionID的请求才能够访问Session池里的这个Session对象;

   而Cache是没有ID的,在服务器端保存的缓存数据,所有的浏览器用户都能访问;

 

2.使用缓存的两个前提条件:

   a.经常被访问(才有使用缓存的必要)

   b.数据修改频率不高(不会被经常修改)

   c.或者 允许存在脏数据

 

 

 

Session

1.存放的位置:进程内Session(aspnet_wp.exe),专门的状态服务中(aspstate服务),存数据库

  1.1  进程内Session,服务器关闭就自动关闭;

         缺点:容量较小,当出现大数据量的时候会自动重启,从而丢失所有的Session。

 

  1.2  状态服务:专门一个存放Session的进程,不随服务器关闭和启动,存放的数据量也比较大。

         缺点:关闭电脑就没了。

 

 

  1.3  数据库:存数据库中,优点是永久保存,

         缺点需要读取硬盘。

         由于浏览器SessionId无法长久保存,所以一般不使用数据库保存Session。

 

 

posted @ 2018-01-01 17:54  兽人松  阅读(123)  评论(0编辑  收藏  举报