前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚上我还是坚持打开电脑,分享一些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内部原理(三) 第三个版本 (最详细的版本)的更多相关文章

  1. asp.net内部原理3

    asp.net内部原理(三) 第三个版本 (最详细的版本) 前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚 ...

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

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

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

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

  4. JVM 内部原理(三)— 基本概念之类文件格式

    JVM 内部原理(三)- 基本概念之类文件格式 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Envi ...

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

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

  6. 【ASP.NET Identity系列教程(三)】Identity高级技术

    注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

  7. asp.net跳转页面的三种方法比较

    目前,对于学习asp.net的很多朋友来讲,实现跳转页面的方法还不是很了解.本文将为朋友们介绍利用asp.net跳转页面的三种方法,并对其之间的形式进行比较,希望能够对朋友们有所帮助. ASP.NET ...

  8. Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)

    在前面介绍了java的多线程的基本原理信息:线程池的原理与使用 本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用j ...

  9. 《ASP.NET SignalR系列》第三课 SignalR的支持平台

    从现在开始相关文章请到: http://lko2o.com/moon 接着第二课:<ASP.NET SignalR系列>第二课 SignalR的使用说明 一.服务器系统要求 SignalR ...

随机推荐

  1. 【DataStructure】Linked Data Structures

    Arrayss work well for unordered sequences, and even for ordered squences if they don't change much. ...

  2. pip使用国内镜像,豆瓣、清华

    pip使用国内镜像,豆瓣.清华 2017年01月18日 22:27:44 阅读数:4416 Python开发的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导 ...

  3. libRTMP文档

    https://rtmpdump.mplayerhq.hu/ 原文地址:http://rtmpdump.mplayerhq.hu/librtmp.3.html git clone git://git. ...

  4. Jquery easyui tree 一些常见操作

    Tree: easyui tree的异步加载实现很简单,easyui的中文API文档中有实例(http://api.btboys.com/easyui/)——创建异步树形菜单,就是在tree node ...

  5. Android Activity 传递数据

    activity中数据的传递方式有2中,一种是使用putExtra()传递,另外一种是传递Bundle对象,使用putExtras()方法. 方法一 发送数据 putExtra()传送的是键值对,第一 ...

  6. 【转载】C# 快速高效率复制对象另一种方式 表达式树

    1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...

  7. 双卡手机怎么指定SIM卡打电话

    双卡手机如何指定SIM卡打电话 package com.example.dualsimtest; import android.app.Activity; import android.content ...

  8. opengl 裁剪平面

    原帖地址:http://blog.sina.com.cn/s/blog_5ff6097b0100xqvr.html void glClipPlane(GLenum plane, const GLdou ...

  9. Spring-Resource接口

    4.1.1 概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源资源.ClassPath相关资源.服务器相关资源(JBoss AS 5.x上的VFS资源)等等很 ...

  10. SQL-字符串连接聚合函数

    原文:http://blog.csdn.net/java85140031/article/details/6820699 问题: userId  role_name         role_id 1 ...