关于ASP.NET运行机制
混迹博客园已经快半年了,从来都是默默的关注园内大侠的文章,吸取养分,却从未发过自己的帖子。主要原因还是刚刚踏入IT的大门,时日不长,真心没什么拿得出手的。后来发现园内很多朋友的博文除了写出心得体会与人分享之外,还可以理清自己的思路,整理成文也可做为知识的一次备份。明白了这点后,决定以后也将平时学习过程中的所得所想写在博客上。
接触ASP.NET已经快半年了,以前搞ASP.NET的开发大多都是拖控件,未尝试着了解ASP.NET的内部运行机制。日前在院内看阅读了 小洋(燕洋天)大侠的《《浅谈ASP.NET内部机制》》系列博文,再结合传播智客的邹华栋老师的相关课程视频,大概理理自己的思路。
首先,上图一张( 在VISIO里面画的图,尺寸没把握好):
当Client端向服务器端发送一个请求时,会经过如上图所示的流程。首先,IIS内部的一个组件叫做Http.sys会对请求的url进行验证,这样不符合要求的URL将会不发往ASP.NET这样就减轻了服务器的压力。Http.sys主要做两种验证:1、判断URL的大小是否大于16KB;2、判断各路径是否大于255个字节。在IIS中还有另外一个组件,为ASP.NET.Isapi.dll,这个组件并不能真正处理请求,他只是作为一个桥梁而存在。通常这个组件会通过特定的接口与Framework进行通信,Framework通过产生对应aspx页面的页面类来执行程序。其中,值得一提的是,纯粹的Html是不需要在服务器端进行运行的,直接通过IIS返回给客户端。IIS中如何实现验证的请参阅小洋(燕洋天)的博文
浅谈ASP.NET的内部机制(一)。
下面是细化图:
上图中,Application Domain是应用程序域,可以理解为应用程序的运行空间。ASP.NET ISAPI将请求交给网站程序,网站程序通过调用HttpRuntime类中的静态方法处理请求。在处理过程中,他主要做了如下工作:1、将请求报文中发送过来的数据进行保存,保存在HttpWorkRequest类的对象的相应属性当中;2、通过调用HttpApplicationFactory中的静态方法创建HttpApplication对象,可以分析,倘若服务器每次都得为响应一个请求而创建一个HttpApplication对象的话,对服务器的压力将会非常巨大。所以在ASP.NET中会有一个叫做HttpApplication pool的东西,当有请求发送过来时,HttpApplicationFactory类会在HttpApplication pool中搜寻已经清楚所有状态的HttpApplication 的对象来赋予数据,指导这次请求的程序运行。;3、创建HttpContext对象,此对象代表了页面的上下文,内部包含了处理请求的所有数据。值得一提的是,在ASP.NET的一般处理程序的ProcessReques方法当中需要传入类型为HttpContext的对象作为参数,因此HttpContext的创建应该在靠前。在HttpConcontext中封装有HttpResponse与HtttpRequest两个类的对象,其中分别对应两个类的Form、QuerySring属性和Write属性用于获取请求中的数据和发送数据给客户端。Form属性用于获取Form表单中的数据,QueryString用于获取Url当中的数据。
HttpApplication类的对象主要用于控制整个程序的执行,类中的ProcessRequest方法非常关键,在页面代码运行之前,ProcessRequest方法会相继按顺序执行总共19个委托事件(也就是常说的管道),在其中第八个事件会创建被请求的页面类对象,在第十一至第十二的事件期间会调用被请求页面类的ProcessRequest方法。
有不少地方存在含混不清,或者错误的地方,待以后进行改正。
最后附上一些杂乱的总结:
1、一般处理程序结构。
1 <%@ WebHandler Language="C#" Class="Handler" %> 2 3 using System; 4 using System.Web; 5 6 //一般处理程序必须继承此接口IHttpHandler ,这样ASP.NET才能通过形如 7 //IHttpHandler handle=new 页面类()接口类型的变量来调用某页面的处理程序 8 public class Handler : IHttpHandler 9 10 { 11 12 public void ProcessRequest (HttpContext context) {//HttpContext为上下文对象类,封装了程序处理中的数据 13 context.Response.ContentType = "text/html";//控制一般处理程序发给客户端的内容呈现样式,倘若将html改成plain,将显示出鸳鸯的Html代码 14 context.Response.Write("Hello World"); 15 } 16 17 public bool IsReusable {//表示是否重用 18 get { 19 return false; 20 } 21 } 22 23 }
2、http请求详解图
套接字:多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
3、ASP.NET六大系统对象