|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。</p>当一个客户端页面会见IIS试图猎取一些信息的时分,产生了甚么事变?一个哀求在经由过程了HTTP管道后又产生了甚么?本文次要是形貌这两个历程,即IIS处置asp.net哀求和asp.net的页面熟命周期。接待人人主动拍砖,配合进修,配合前进。
起首我们要弄分明两个十分主要的观点:
1,workerprocess(w3wp.exe).workerprocess办理一切的来自客户真个哀求并给出呼应。它是IIS下asp.net使用程序的中心。
2,applicationpool.它是workerprocess的容器,IIS5及之前的IIS版本均没有applicationpool的观点。每个applicationpool对应着一个workerprocess,在IISMetabase中保护着ApplicationPool和workerprocess的Mapping。这就制止了IIS5中呈现的workerprocess(IIS5中是aspnet_wp.exe,统一工夫只能运转一个该历程)溃散,application全溃散的场合排场。
客户端向IIS收回一个资本哀求后产生了以下事变:
1,server承受该哀求
IIS6经由过程内核形式(Kernelmode)中的HTTP.SYS来分发各个Request到applicationpool。这并非随机的历程,在applicationpool创立的时分就已注册到了HTTP.SYS,以是当哀求离开时HTTP.SYS会间接发送到响应的applicationpool。接上去在IIS的用户形式(Usermode)中,WebAdminServices(WAS)做了从HTTP.SYS中失掉Request并分发到applicationpool的事情。applicationpool间接把request传送给workerprocess。
2,哀求传送到workerprocess后,workerprocess初始化加载ASP.NETISAPI(InternetServerApplicationProgramInterface),ASP.NETISAPI进而加载CLR创立托管情况。
(注:ISAPI只是一个接口,起到一个代办署理的感化,次要才能就是依据RequestURL的后缀来寻觅该后缀的处置程序)
ASP.NETISAPI界说在aspnet_isapi.dll中,它自己运转在一个非托管的情况中。ASP.NETISAPI入手下手一个HttpRuntime,HttpRuntime挪用ProcessRequest办法来入手下手处置哀求。ProcessRequest依据ISAPI传出去的iWRType来创立分歧的HttpWorkerRequest,从而屏障了分歧IIS的差别。接上去ProcessRequest办法创立了HttpContext,我们利用HTTPContext.Current来会见它。在HttpRuntime利用HttpApplicationFactory创立了HttpApplication工具(IHttpHandler)今后,一切的哀求城市在经由过程httpmodule后找到响应的Httphandler举行处置。在HttpApplicationFactory创立HttpApplication之前,会查找config(web.config和Machine.config)文件中注册的一切的HttpModule,并依据设置信息加载响应的Assembly,经由过程Reflection创立对应的HttpModule,并将这些Module加到HttpApplication的_moduleCollectionFiled中。我们对一个Application的哀求终极会落到一个HttpApplication工具上。当一个哀求到来时,ASP.NET会在HttplicationPool中查找未被利用的HttpApplication工具。
3,哀求经由过程HTTP管道后,每一个哀求都发向相干的各自的httphandler,IIS哀求处置历程停止。
HttpHandler是HTTP管道的尽头,它为每一个request天生输入。System.Web.UI.Page就是如许一个典范的Httphandler,当我们哀求一个aspx页面,这个HttpHandler就天生html发送回客户端。看Page类的署名:
publicclassPage:TemplateControl,IHttpHandler
{
}
能够看到,Page类就是一个HttpHandler。
综上全部历程就是:当客户端向服务器发送资本哀求时,哀求起首抵达IIS的HTTP.SYS。然后HTTP.SYS发送哀求道对应的ApplicationPool。然后ApplicationPool发送哀求到WorkerProcess(W3WP.exe)中加载ISAPIExtension,ISAPI创立一个HttpRuntime工具来经由过程HttpModule和HttpHandler处置哀求。然后页面熟命周期就入手下手了。
4,页面熟命周期入手下手
页面熟命周期的次要阶段包含:
页面初始化(Init):服务器创立服务器控件的实例
加载(load):控件实例被加载到它界说的页面临象中
预输入:(PreRender)对控件的变动被更新,筹办输入。
保留(SaveViewState):控件的形态信息被保留。
输入页面(Render):服务器为控件创立html标志。
处置(Dispose):次要做的事情就是dispose,封闭数据库毗连,文件资本的开释等。
卸载(Unload):烧毁服务器控件的实例
页面熟命周期的次要事务:
PreInit:
1.反省IsPostBack属性
2.静态设置MasterPage
3.静态设置Theme
4.设置控件的默许值(UniqueId等)
5.从头创立静态控件(初始化控件),初始化控件的值
Init:这个事务产生在一切的控件被初始化,一切的皮肤设置被使用今后。它用来读取大概初始化控件属性。它可以用来注册一些aspx页面中没有指出的控件的事务。
InitComplete:Usethiseventforprocessingtasksthatrequireallinitializationtobecomplete.
PreLoad:加载页面的ViewState和一切的控件,然后处置一切的包括在Request实例中的postback数据。
Load:这个事务多是人人最熟习的了。必要注重的是,Page工具会递回的挪用子控件的onload事务直到页面和一切的子控件被加载完成。这个事务次要用来设置控件属性的值,创建数据库毗连(一般不这么做)。
Controlevents:这个就未几说了,次要是处置控件的事务,比方click。这也就让我们分明了每次我们click一个Button的时分,实践上是要先往实行load事务然后才实行click事务的,一样平常我们用!IsPostBack来判别一下从而制止实行不用要的加载逻辑。
LoadComplete:页面一切的控件都被加载今后实行,临时没有想到用来干甚么。。。
PreRender:在HTML被天生之前这是最初一个事务。每个页面中的控件都有PreRender的历程。在这里对将要输入的HTML了局举行最初一次修正。
SaveStateComplete:在这个工夫产生之前,已保留了一切控件和页面的,任何对page大概控件的修改都不会发生摆布。临时没想到用来干啥。
Render:它不是一个事务而是一个办法。事情就是把HTML写回客户端扫瞄器。
UnLoad:页面中的每个控件城市产生这件事。在控件中,利用这个事务来做清算事情,比方封闭数据库毗连等。对与页面自己也是做清算事情,比方封闭翻开的文件和数据库毗连,大概停止日记大概别的指定的事情。
必要申明的是,每次Request城市创立一个全新的Page类的实例,以是在页面中的本人界说的字段是不克不及在两次request中传送值的,必要利用viewstate来存储。
5,HttpHandler依据页面熟命周期中事务的处置把了局发还IIS,IIS再把了局发还客户端扫瞄器。
值得注重的是,在这个过程当中哀求会再次经由过程HttpModule(注册一个EndRequest事务)。
至此,全部Request停止。可怜的程序员,还是逃不出移植的命运! |
|