asp.net内部原理(三) 第三个版本 (最详细的版本)

前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚上我还是坚持打开电脑,分享一些asp。net生命周期的知识,一是可以巩固自己所掌握的知识,并且在分享的期间也能发现一些问题和大家一起探讨,同时也希望让一些“小白”们尽可能的了解asp内部的运行原理,不要每天只知道把控件拖来拖去,或者是只是知道这么写代码,而不知道为什么这么写代码。

首先呢,让我们在复习一下上一节的内容:

1)浏览器输入请求网址的域名,浏览器按照HTTP协议封装成请求报文,然后通过DNS解析域名得到IP地址,接着通过socket插座将请求报文传到服务器.

2)IIS接受到请求后,解析要求请的是一个什么类型的文件,如果请求的是静态文件,那么IIS会直接处理,在本地找到请求的静态文件,然后发送给浏览器。

3)如果是动态文件,如aspx或者ashx等动态文件,IIS会发现自己处理不了这样的文件,那么,IIS就会去他的映射表里面去找,实现它接口的那个扩展程序可以处理这样的动态文件,然后IIS发现有个叫做aspnet_isapi的这样一个扩展程序可以处理处理像.aspx和.ashx这样后缀名的文件,那么IIS则把请求交给这个aspnet_isapi来处理。

4)aspnet_isapi将启动CLR(公共语言运行时),负责启动asp.net框架的域,然后将请求交给asp.net框架来处理,框架里面有个一HttpRuntime类的对象,那倒请求后,它负责将请求封装成HttpContext对象,常见Application对象,调用application对象的ProcessRequest方法(HttpContext对象作为参数)处理请求(具体的实现我们将在后面讲解到),最后处理完成后,返回给IIS,IIS在返回给浏览器。

这是上一结我们所讲的内容,那这一节我们主要讲的是:

1--请求报文是怎么到iis的,iis又是怎么处理的

2--请求报文时怎么传递给CRL的

3--CRL拿到请求之后具体是解析处理请求,然后呈现出我们想要的页面。这里我们重点研究两个东西:

  1)---Application对象的创建以及 HttpModule 注册管道的事件  golable注册管道事件

  2)---页面的生命周期

这一节的内容比较多,而且有些小伙伴认为这里面有些东西是在开发过程当中用不到这知识,但是笔者认为从基础和原理去了解才能让我们正确的掌握asp。net开发并且开发出高质量的应用程序。

在阅读本节内容时,大家先了解一下以下几个概念

内核模式:就是操作系统模式,其中的程序代码能直接访问所有内存(包括所有的用户模式进程和应用程序的地址空间)和硬件,也称为“管理员模式”、“保护模式”或“Ring 0”。

用户模式:跑在操作系统之上,比如说qq,百度影音这些应用程序。都是跑在用户模式之上的。

在windows xp以前(包括xp),基于http协议的的程序都是在用户模式下运行的,而且必须自己处理例如软件中断、context swith、线程调度等问题,并且无法直接接触系统资源,过去,HTTP服务器,如IIS, Apache等都是利用Winsock API来创建一个User mode下的network listener,这个network listener往往独自占用一个ip端口,也就是说,同一个端口在同一时间只能有一个应用程序监听,这在有些时候是一个不太令人舒服的限制。

在windows 2003以后,

进了新的HTTP API和kernel mode driver(内核模式驱动) Http.sys,目的是使基于Http服务的程序更有效率。这个改变的直接收益者就是IIS6.0和ASP.NET。
那么现在是有http.sys来监听求情端口。http.sys得好处:
1、可以缓存,静态内容可以缓存到内核模式下,是服务器相应更加快速
2、安全可靠,应为所有的请求都会在http.sys里面暂存在列队中,而不是由服务程序本身来处理,这样一来,就是服务程序崩溃重启,请求也不会丢失。
3、IP端口重用 - 现在,只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。
4、带宽控制(额。。其实我也不知道他这个是咋控制的,反正就是能控制)
 
 
好了,了解了这些之后,让我们进入今天的正题。
首先我还是上一个图吧。大家看着图,然后我在下面解释,我觉得这样会解释的更清楚一些。
1--首先,浏览器发送一条请求到服务器,服务器端,内核模式下的http.sys这个内核驱动,拿到了http请求,拿到请求后,他要去找,哪个应用程序可以处理这个求情(或者说去找谁在我这注册过,说它吖的可以处理http请求),去哪找呢,是去注册表里面找。然后他发现,有个叫iis的小子在我这注册过,说它可以处理,那么http.sys就把这个请求交给iis去处理。
2--这时,iis拿到了请求。 其实iis可以分为两块,一块就是iis的核心进程:inetinfo.exe(这里面放着iis的所有的配置信息和网站信息),另一块就是w3svc服务(寄生在svchost进程上),这个服就是管着将请求分发的。分发给什么呢?就是在上一节中我们说到的像aspnet_isapi.dll这样的扩展程序。这个服务先去核心进程里面的配置信息里面去寻找,注册的哪个扩展程序可以处理请求的页面,比如请求的是aspx页面,他发现aspnet_isapi.dll这个扩这注册了说它可以处理,那么w3svc服务将请求分发给aspnet_isapi.dll来处理。
3--这时,aspnet_isapi.dll 拿到了请求信息,这时,aspnet_isapi.dll负责启动CLR(公共语言运行时,里面跑的是托管代码),这里你可以把aspnet_isapi.dll看成是一个桥梁,一个非托管和托管之间的一个桥梁 。
 
CLR被启动好了之后,调用托管代码中ISAPIRuntime得ProcessRequest(以后我会简称其为PR方法),ISAPIRuntime类就是system。web。hosting命名空间下的一个类,也是CLR处理http请求的一个入口类,如果你想看CRL是怎么处理http请求,你就可以从这个类开始。
 
在上图中我们可以看出调用了ISAPIRuntime类的PR方法,将http请求信息(ecb)作为参数传进去。
  ---ecb:包含了底层的所有请求信息,包括服务器信息,一个来组织标量的输入流还有一个写回数据给浏览器的输出流,,它包含了ISAPI求其的所有功能。
 
如上图在ISAPIRuntime的PR方法中,先创建了一个HttpWorkerRequest对象,然后又调用了HTTPRuntime的PR方法进一步处理请求。
 
如上图,在HttpRuntime的PR方法里面,主要三个事就是:
  1--创建上下文对象HttpContext(将请求信息封装成上下文对象)
  2--创建Application对象:这里用到了应用程序池技术,因为创建一个Application对象很消耗资源。这个Application对象很重要,在下一节我们重点讨论他,同时在下一节还讨论时如何创建页面控件树的。
  3--调用Application对象的PR方法,将上下文对象作为参数穿进去。此时,http请求(这时候已经被封装成HttpContext)就由application交给了HttpHandler来处理,然后调用HttpHandler的PR方法,继续处理请求(这里开始走页面的生命周期,也就是那十个事件)
 
在HttpApplication的PR方法里,开始走HttpApplication负责的求情处理管道,就是我们经常说的19个事件,23个步骤。
在这个请求处理管道里面具体的内容,我贴上两个图,相信大家就看的差不多明白了,如果不明白也没关系,在下一节我会详细介绍请求管道干的事情和我们在开发过程中如果应用这个管道写出高质量的web应用程序。
 
 
好啦,今天就介绍到这吧,各位,晚安。
 
 
 
 
 
 
 

asp.net内部原理3的更多相关文章

  1. 【原创】asp.net内部原理(三) 第三个版本 (最详细的版本)

    前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚上我还是坚持打开电脑,分享一些asp.net生命周期的知识, ...

  2. ASP.NET内部原理(HttpHandler和HttpModule)

    [IT168 技术文档]在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为 inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请 ...

  3. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...

  4. IIS站点工作原理与ASP.NET工作原理

    IIS站点工作原理与ASP.NET工作原理  一.IIS IIS 7.0工作原理图 两种模式: 1.用户模式(User Mode)(运行用户的程序代码.限制在特定的范围内活动.有些操作必须要受到Ker ...

  5. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

     前言:      记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别?      促使我对进程池进了知识的学习,所以记录一下学习 ...

  6. ASP.NET MVC原理

    仅此一文让你明白ASP.NET MVC原理   ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与 ...

  7. 深入理解javascript作用域系列第一篇——内部原理

    × 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域 ...

  8. ASP.NT运行原理和页面生命周期详解及其应用

    ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用.  ...

  9. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

随机推荐

  1. java_代码注释风格

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><templa ...

  2. Zepto Code Rush 2014——Dungeons and Candies

    题目链接 题意: k个点,每一个点都是一个n * m的char型矩阵.对与每一个点,权值为n * m或者找到一个之前的点,取两个矩阵相应位置不同的字符个数乘以w.找到一个序列,使得全部点的权值和最小 ...

  3. 《java系统性能调优》--1.发现瓶颈

    性能啊!性能! 之所以想写写性能调优,也是有感于我们的项目,我们採用一些手段使得系统性能上升了一个台阶,总是须要把这点经验沉淀一下.随着工作的深入,关于系统性能的事肯定还有非常多,也算是通过这个系列文 ...

  4. 探究Java中Map类

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.       Map的接口       Map---实现Map       Map.Entry--Map的内部 ...

  5. JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

    整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...

  6. 设计模式---订阅发布模式(Subscribe/Publish)

    设计模式---订阅发布模式(Subscribe/Publish) 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有订阅者对象,使 ...

  7. npm err错误

    npm ERR!无法安装任何包的解决办法 通过config命令: npm config set registry http://registry.cnpmjs.org

  8. 一个只能用在Win下的密码验证函数(显示星号,可删除)

    以前做小程序时图好玩在网上找的代码.输入的密码会以星号显示出来,并且输入错了可以删除.因为用了专有库函数,所以只能在Windows平台使用,少用为好,不过可能还有点用.嗯…就这样了 #include ...

  9. 强大的jquery-制作选项卡

    最近在学习jquery,特地把今天写的一个选项卡源码贴出来.只是做只是梳理,大神们请不要吐槽,如果有更好的方法,欢迎指点.谢谢. css <style> #tab div{ width:2 ...

  10. WebIM(5)----将WebIM嵌入到页面中

    在之前的文章中,已经开发了一个简单的WebIM,但是这个WebIM是在独立的页面中的,今天发布的WebIM是一个可以嵌入到自己网页中的版本,你只需添加少量的代码,就可以在页面中嵌入一个WebIM.不过 ...