最新开班
课程名称 报名截止 报名人数
高中起点学习班 即将开班 热招中
企业委培订制班 即将开班 热招中
私人名师辅导班 即将开班 热招中
待业速找工作班 即将开班 热招中
专家大课堂
accp
accp
男生
女生学什么好?女生学什么有前途?
高中落榜怎么办?高中生可以学软件么?
专职、再就业,让你的生涯不再与苦累相伴。
联系方式
地图

免费咨询:400-696-8028

报名电话:0731-88122069

学校地址:长沙市开福区金霞跨境产贸城北大青鸟校区

ASP.NET运行机制

 我们从web程序的入口开始。那就要先说到iis了,大家都知道,这是web服务软件。将web程序部署到iis过的人都知道,如果不做任何处理,我们写的webform是不能运行的。为什么非要执行aspnet_regiis才可以呢?我们看*下电脑路径C:WindowsMicrosoft.NETFrameworkv4.0.30319,aspnet_regiis.exe就在这里路径下。我们简单说*下原因,看下iis的历史,在百度上没有查到iis软件发布的年限,但至少iis在windows 2000的时候就存在了,而我们的.net framework在2002-02-13的时候才发布1.0版本,是啊,我们都知道微软很厉害,但就是在厉害他也不会强大到可以预测几年后的软件运行机制吧。也就是说iis对.net framework还说就是个“古董”,他不可能会知道.net framewrok运行机制,更不可能知道asp.net的运行机制。早起的iis也只能处理静态页面,也就类似于html,js,图片之类的东西。但现在如果我们想将asp.net 程序部署到iis上怎么办呢?对,扩展,使用扩展程序,我们运行aspnet_regiis.exe也就是将扩展程序(aspnet_isapi)注入到iis中,这样iis就可以处理了?---------哈哈,iis还是处理处理不了asp.net程序,但是后注入的程序可以告诉iis,我扩展程序可以处理什么样的程序,你如果处理不了,可以尝试交给我处理。
  看*下上面说到的路经下面有个aspnet_isapi.dll,我们只是简单的说*下这里,这个dll是使用c/c++写的,并不是c#写的,所以我们无法反编译成c#代码。这是个承上启下的动态库,因为c/c++并不是我们考虑的范围内,我们直接认为这个程序将请求交给我们“在乎”的程序,下面我们开始反编译我们“在乎”程序。反编译工具中查找ISAPIRuntime这个类,下面是我反编译出来的结果这个类是system.web程序集下的类
  View Code
  其实我贴出代码没有别的意思,就是想用事实说话,过多的内容我们不看,我们只看里面的public int ProcessRequest(IntPtr ecb, int iWRType)处理请求方法。我们先看*下参数类型吧,IntPtr?有调c/c++动态库的人会知道这是c/c++里面指针类型,我们不用过多的考虑。我自己分析的,不知道对不对,正因为这是IntPtr,所以该类应该是调用了c/c++相关的动态库了,不然这里也没有必要用到。这样流程就出来了,IIS——》aspnet_isapi(c/c++相关动态库)——》ISAPIRuntime类;需要提到*点的是,IntPtr是个指针,指针会指向*块内存区域,可能很大,也可能很小。我认为请求的内容放在了这块区域中,从这里面可以获取到浏览器请求头的内容下面是ProcessRequest方法的内容
  View Code
  下面我们来分析*下这里面的代码,我们只分析重要的部分。
  这里新建了*个 ISAPIWorkerRequest wr = null;类,进行创建封装该对象,wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);上面说了ecb是个指针,里面可以存储很多请求内容的。紧接着对wr进行初始化wr.Initialize();我们着重看HttpRuntime.ProcessRequestNoDemand(wr);注意这里使用的是HttpRuntime,*会我们还会分析该类,现在我们进入ProcessRequestNoDemand方法里面看看。这里面应该是关于多线程模型了
  View Code
  这时ISAPIRuntime已经将请求交给HttpRuntime类了,HttpRuntime类调用RequestQueue queue = _theRuntime._requestQueue;该类试图获取请求处理队列,我们可以简单的认为服务器在求情*个线程来处理该次浏览器的请求。wr = queue.GetRequestToExecute(wr);我们进入到GetRequestToExecute方法,
  View Code
  当然服务器不可能只有*个求情,如果同时有多个用户请求,这时队列中就可能没有线程可响应此次请求,在这里面就会调用this.ScheduleMoreWorkIfNeeded();从线程池中拿出*个来处理请求。下面我们返回ProcessRequestNoDemand()方法,该方法调用了ProcessRequestNow(wr);处理请求。
  View Code
  我们只看ProcessRequestNow()方法
  这个方法又调用了HttpRuntime的ProcessRequestInternal方法,接下来我们开始分析HttpRuntme类,
  View Code
  看ProcessRequestInternal()方法
  View Code
  在这里创建了上下文 HttpContext context;对象,使用wr(wr中封装了请求信息)对象创建了上下文对象 context = new HttpContext(wr, false);
  IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);使用HttpApplicationFactory创建HttpApplication对象,applicationInstance.ProcessRequest(context);在这个方法中会调用近20几个是事件,该对象在后面的事件中通过反射创建请求页面类的对象在第7个事件和第8个事件中间通过反射创建前台页面类对象,后续的事件之间又调用页面类对象的ProcessRequest方法,这就是我们写的asp.net程序后台类为什么有ProcessRequest方法了,我们应该知道前台页面类继承后台页面类,我在这里再贴*下HttpApplication类的代码

上一篇:ASP 五大高效提速技巧
下一篇:ASP.NET主机介绍

长沙科泰
长沙科泰
长沙科泰IT教育