zoukankan      html  css  js  c++  java
  • ASP.NET机制详细的管道事件流程

          最近回顾了一些新知识, 本人简单介绍下ASP .NET机制,:在这里与大家一起分享一下:

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

    1)浏览器向IIS服务器发送请求网址的域名,根据HTTP协议封装成请求报文,通过DNS解析请求的IP地址,接着通过socketIIS通讯。

     

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Net;
     5 using System.Net.Sockets;
     6 using System.Text;
     7 
     8 namespace MyIIS
     9 {
    10     using System.Threading;
    11    public class SocketServer
    12     {
    13       Socket serverSocket;
    14        int port;
    15        string ip;
    16        Action<string> display;
    17 
    18        //函数
    19       public  SocketServer(int port,string ip,Action<string>display)
    20       {
    21           this.display = display;
    22           this.ip = ip;
    23           this.port = port;
    24     
    25       }
    26       public void Start()
    27       {
    28           //1.开启socket
    29           serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    30 
    31           //2. 将socket帮到指定的IP和端口
    32           IPEndPoint ipp = new IPEndPoint(IPAddress.Parse(ip),port);
    33           serverSocket.Bind(ipp);
    34           //3 开启监听
    35           serverSocket.Listen(10);
    36 
    37           //4.等待客户端的连接 
    38 
    39           Thread th = new Thread(AcceptClient);
    40           th.IsBackground = true;
    41           th.Start();
    42           this.display("服务器启动成功");
    43 
    44       }
    45       bool isStop = false;
    46        //监听客户端的链接
    47       private void AcceptClient()
    48       {
    49           while (!isStop)
    50           {
    51               //接受客户端的链接
    52               Socket cSocket = serverSocket.Accept();
    53 
    54               Thread MsgSocket = new Thread(ReceiveMsg);
    55               MsgSocket.IsBackground = true;
    56               MsgSocket.Start();
    57 
    58          }
    59       }
    60       //接受客户端的信息
    61       private void ReceiveMsg(object socket)
    62       {
    63         
    64               Socket tmpsocket = (Socket)socket;
    65 
    66 
    67               while (!isStop)
    68               {
    69 
    70                   byte[] recBuffer = new byte[1024 * 1024];
    71 
    72                   tmpsocket.Receive(recBuffer);
    73                   string requestMsg = System.Text.Encoding.UTF8.GetString(recBuffer);
    74                   this.display(requestMsg);
    75                   byte[] responseBytes = IsapiRuntime.ProcessRequest(requestMsg);
    76                   // 通过socket将内容发送回浏览器
    77                   tmpsocket.Send(responseBytes);
    78               }
    79           
    80           
    81       }
    82     }
    83 }
    URL向IIS发送请求

     

    第二.IIS服务器判断文件类型。

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

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

    第三.执行ASP.NET框架的ISAPIRrunTime

    ISAPIRrunTime 通过它的 ProcessRequest 方法,把HttpContext的HttpRequest做为参数,传给ISAPIRrunTime 类的方法,该类创建了HttpRuntime对象。

     

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

    一)实例化HttpContext对象

     1  private static byte[] ProcessRequestInternal(string requetMessage)
     2         {
     3             //1实例化HttpContext对象
     4          
     5             HttpContext context = new HttpContext(requetMessage);
     6 
     7             //2 根据HttpApplicationFactory.GetHttpApplicatonInstance()
     8 
     9             IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);
    10             applicationInstance.ProcessRequest(context);
    11                    }
    创建2大对象

     

    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管道事件

    执行完毕。

     希望这个简单的ASP.NET机制对大家有帮助,接下来会详细讲每个事件的详细信息,请关注。

     

     

     

     

  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/janekimyan/p/3400602.html
Copyright © 2011-2022 走看看