• ASP.NET机制详细的管道事件流程(转)


    ASP.NET机制详细的管道事件流程

    第一:浏览器向服务器发送请求。

    1)浏览器向iis服务器发送请求网址的域名,根据http协议封装成请求报文,通过dns解析请求的ip地址,接着通过socket与iis通讯。

     using system;
     using system.collections.generic;
     using system.linq;
     using system.net;
     using system.net.sockets;
     using system.text;
     
     namespace myiis
     {
         using system.threading;
        public class socketserver
         {
           socket serversocket;
            int port;
            string ip;
            action<string> display;
     
            //函数
           public  socketserver(int port,string ip,action<string>display)
           {
               this.display = display;
               this.ip = ip;
               this.port = port;
         
           }
           public void start()
           {
               //1.开启socket
               serversocket = new socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp);
               //2. 将socket帮到指定的ip和端口
               ipendpoint ipp = new ipendpoint(ipaddress.parse(ip),port);
               serversocket.bind(ipp);
               //3 开启监听
               serversocket.listen(10);
               //4.等待客户端的连接
               thread th = new thread(acceptclient);
               th.isbackground = true;
               th.start();
               this.display("服务器启动成功");
           }
           bool isstop = false;
            //监听客户端的链接
           private void acceptclient()
           {
               while (!isstop)
               {
                   //接受客户端的链接
                   socket csocket = serversocket.accept();
                   thread msgsocket = new thread(receivemsg);
                   msgsocket.isbackground = true;
                   msgsocket.start();
              }
           }
           //接受客户端的信息
           private void receivemsg(object socket)
           {
                   socket tmpsocket = (socket)socket;
                   while (!isstop)
                   {
                       byte[] recbuffer = new byte[1024 * 1024];
                       tmpsocket.receive(recbuffer);
                       string requestmsg = system.text.encoding.utf8.getstring(recbuffer);
                       this.display(requestmsg);
                       byte[] responsebytes = isapiruntime.processrequest(requestmsg);
                       // 通过socket将内容发送回浏览器
                       tmpsocket.send(responsebytes);
                   }
           }
         }
     }

    第二:iis服务器判断文件类型。

    1iis接受到请求后,解析要求请是什么类型的文件,如果请求的是静态文件(例如:html,js ,cs ,etc),iis会直接处理,根据前台页面类的url名称,到本地找到被请求的页面类,返回给浏览器。

    2 如果是动态文件(例如:ashx,aspx),iis发现自己处理不了该文件,那么就到映射表找,找个一个叫aspnet_isapi的扩展程序,可以直接处理ashx,aspx后缀的动态文件,然后交给asp.net框架处理。

    3).执行asp.net框架的isapirruntime。

    isapirruntime 通过它的 processrequest 方法,把httpcontext的httprequest做为参数,传给isapirruntime 类的方法,该类创建了httpruntime对象。

    第三.httpruntime类主要创建了量大对象。

    一)实例化httpcontext对象

     private static byte[] processrequestinternal(string requetmessage)

      {

        //1实例化httpcontext对象

      httpcontext context = new httpcontext(requetmessage);

      //2 根据httpapplicationfactory.gethttpapplicatoninstance()

      ihttphandler applicationinstance = httpapplicationfactory.getapplicationinstance(context);

       applicationinstance.processrequest(context);

    }

    1)创建httpcontext类

    httprequest 请求报文:主要是iis服务器请求报文。

    httpresponse响应报文主要是向浏览器响应报文。

    httpserverutility的属性server:主要是获取请求类的物理路径。

    remaphandler接口:主要是保存创建好的被请求类的对象

     

    1)创建httpcontext类

     

    httprequest 请求报文:主要是iis服务器请求报文。

     

    httpresponse响应报文主要是向浏览器响应报文。

     

    httpserverutility的属性server:主要是获取请求类的物理路径。

     

    remaphandler接口:主要是保存创建好的被请求类的对象

    二)实例化httpapplicationfactory对象

     

     httpapplicationfactory对象通过它的pr(processrequest)方法创建 httpapplication对象。

     

    三)httpapplication对象大概创建19个委托对象。

     

    httpapplication对象大概创建19个委托对象,也称为管道事件。

     

    第1管道事件

     

    主要是全局的捕获,可以在这里执行一个方法,这个方法比每个页面的方法先执行。也可以捕获异常,主要是没有被try {}catch{}捕获到的异常,详细看源代码。

     

    第2-5管道事件

     

    主要是请求用户的信息以及页面的访问权。

     

    第6-7管道事件

     

    主要是判断页面是否有缓存,如果有,直接读取缓存,不再继续执行asp.net机制。如果没有,就往下执行。

     

    第8管道事件

     

    通过反射创建被请求的页面类对象,把它存在remaphandler属性里面。

     

    第9-10管道事件

     

    判断页面是否保存了有效的session,如果有效,就不再到session创建session对象,同时,保存sessionid在客户端的内存。

     

    第11-12管道事件

     

    判断是静态页面还是动态页面,如果是静态页面,那么就不用执行生命周期。否则,就执行生命周期。通过_buildcontroltree创建控件数。

     

    调用生命周期render方法,创建html代码。

     

    第13-16管道事件

     

    释放资源以及更新缓存。

     

    第17-18管道事件

     

    更新日志。

     

    第19管道事件

     

    执行完毕。

     

    转载自马开东博客:http://www.makaidong.com/

  • 相关阅读:
    Java 面试 --- 3
    Java 面试-- 1
    面试之痛 -- 二叉树 前序 中序 后序
    java 事务
    深入理解mybatis
    hibernate
    mybatis 原理
    spring 原理
    spring aop
    spring 事务
  • 原文地址:https://www.cnblogs.com/jicheng/p/6396589.html
Copyright © 2020-2023  润新知