当前位置:首页 > 青鸟知识 > net

ASP.NET运转机制

来源:长沙it培训学院 发布日期:2016-05-21
摘要:我们从web法式的进口起头。那就要先说到iis了,巨匠都明白,这是web办事软件。将web法式摆设到iis过的人都明白,若是不做任何处置,我们写的webform是不克不及运转的。

我们从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类的代码
View Code
感乐趣的能够看一下这外面的属性,事务(事务实行挨次其实不是写的阿谁挨次);上面我画张图,俭朴描写一下进程

剩下就是页面类实行ProcessRequest的方式了,明天先不说了,太晚了。接上去我们连续mvc也可以了,我们mvc并没有页面类的ProcessRequest方式,今后有时分在说这里吧。


拒绝套路 试听有礼

数据已加密保证您的信息安全