海妖 发表于 2015-1-16 22:19:00

ASP.NET教程之IIS处置asp.net哀求和asp.net的页面熟命...

刚刚打开这篇专题,猛然见到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停止。可怜的程序员,还是逃不出移植的命运!

乐观 发表于 2015-1-19 08:18:46

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

山那边是海 发表于 2015-1-27 06:19:23

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

活着的死人 发表于 2015-2-5 03:56:29

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

蒙在股里 发表于 2015-2-11 04:09:58

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

柔情似水 发表于 2015-3-11 00:19:19

对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。

灵魂腐蚀 发表于 2015-3-17 16:51:26

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

不帅 发表于 2015-3-24 13:17:36

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
页: [1]
查看完整版本: ASP.NET教程之IIS处置asp.net哀求和asp.net的页面熟命...