zoukankan      html  css  js  c++  java
  • 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() + "
    ");
    }

    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。

     

  • 相关阅读:
    Oracle 操作数据库(增删改语句)
    web----框架基础
    js----DOM对象
    易错之for循环
    python调用修改变量新方法
    js----基础
    web----Twisted
    web----Socket
    python----面向对象(2)
    python----面向对象
  • 原文地址:https://www.cnblogs.com/lisong-home/p/8168072.html
Copyright © 2011-2022 走看看