ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
2014-06-25 13:01
597 查看
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节。
①以IIS6.0为例,首先由w3wp.exe维护着一个工作进程
![](http://images.cnitblog.com/blog/417212/201406/190025297234695.png)
②如果是第一次加载,由Aspnet_isapi.dll加载.NET运行时
![](http://images.cnitblog.com/blog/417212/201406/190025302541025.png)
③一个工作进程里有一个应用程序池,其中可以承载多个应用程序域AppDomain
![](http://images.cnitblog.com/blog/417212/201406/190025308325666.png)
④HTTP.SYS接收请求,通过应用程序域工厂AppDomainFactory创建应用程序域AppDomain
![](http://images.cnitblog.com/blog/417212/201406/190025315514754.png)
⑤一个IsapiRuntime被加载,并创建一个IsapiWorkerRequest对象封装当前的HTTP请求,并把该IsapiWorkerRequest对象传递给ASP.NET的HttpRuntime运行时,此时, HTTP请求开始进入ASP.NET请求管道
![](http://images.cnitblog.com/blog/417212/201406/190025324429425.png)
也就是说,HttpRuntime是ASP.NET请求管道的入口。当请求进来,首先进入HttpRuntime,由HttpRuntime来决定如何处理请求。默认情况下,在machine.config和Web.config中并没有显式定义httpRuntime节点,但该节点是有默认值的,如下:
通常,我们可以在Web.config中更改httpRuntime节点的默认值,如下:
⑥HttpRuntime维护着一个HttpApplication池,当有HTTP请求过来,从池中选取可用的HttpApplication处理请求
![](http://images.cnitblog.com/blog/417212/201406/190025330518012.png)
HttpApplication有19个管道事件,分别是:
我们可以在全局配置文件Global.asax中,按照约定的规则Application_{Event Name}来对管道事件定制:
ASP.NET MVC请求处理管道生命周期的19个关键环节系列包括:
①以IIS6.0为例,首先由w3wp.exe维护着一个工作进程
![](http://images.cnitblog.com/blog/417212/201406/190025297234695.png)
②如果是第一次加载,由Aspnet_isapi.dll加载.NET运行时
![](http://images.cnitblog.com/blog/417212/201406/190025302541025.png)
③一个工作进程里有一个应用程序池,其中可以承载多个应用程序域AppDomain
![](http://images.cnitblog.com/blog/417212/201406/190025308325666.png)
④HTTP.SYS接收请求,通过应用程序域工厂AppDomainFactory创建应用程序域AppDomain
![](http://images.cnitblog.com/blog/417212/201406/190025315514754.png)
⑤一个IsapiRuntime被加载,并创建一个IsapiWorkerRequest对象封装当前的HTTP请求,并把该IsapiWorkerRequest对象传递给ASP.NET的HttpRuntime运行时,此时, HTTP请求开始进入ASP.NET请求管道
![](http://images.cnitblog.com/blog/417212/201406/190025324429425.png)
也就是说,HttpRuntime是ASP.NET请求管道的入口。当请求进来,首先进入HttpRuntime,由HttpRuntime来决定如何处理请求。默认情况下,在machine.config和Web.config中并没有显式定义httpRuntime节点,但该节点是有默认值的,如下:
<httpRuntime apartmentThreading="false" appRequestQueueLimit="5000" delayNotificationTimeout="5" enable="true" enableHeaderChecking="true" enableKernelOutputCache="true" enableVersionHeader="true" encoderType = "System.Web.Util.HttpEncoder" executionTimeout="110" maxQueryStringLength = "2048" maxRequestLength="4096" maxUrlLength = "260" maxWaitChangeNotification="0" minFreeThreads="8" minLocalRequestFreeThreads="4" relaxedUrlToFileSystemMapping = "False" requestLengthDiskThreshold="80" requestPathInvalidCharacters = "<,>,*,%,&,:,\" requestValidationMode = "4.0" requestValidationType = "System.Web.Util.RequestValidator" requireRootedSaveAsPath="true" sendCacheControlHeader="true" shutdownTimeout="90" useFullyQualifiedRedirectUrl="false" waitChangeNotification="0" />
通常,我们可以在Web.config中更改httpRuntime节点的默认值,如下:
<configuration> <system.web> <httpRuntime maxRequestLength="4000" enable = "True" requestLengthDiskThreshold="512 useFullyQualifiedRedirectUrl="True" executionTimeout="45" versionHeader="1.1.4128"/> </system.web> </configuration>
⑥HttpRuntime维护着一个HttpApplication池,当有HTTP请求过来,从池中选取可用的HttpApplication处理请求
![](http://images.cnitblog.com/blog/417212/201406/190025330518012.png)
HttpApplication有19个管道事件,分别是:
1、BeginRequest:HTTP管道开始处理请求时,会触发BeginRequest事件 2、AuthenticateRequest:安全模块对请求进行身份验证时触发该事件 3、PostAuthenticateRequest:安全模块对请求进行身份验证后触发该事件 4、AuthorizeRequest:安全模块对请求进程授权时触发该事件 5、PostAuthorizeRequest:安全模块对请求进程授权后触发该事件 6、ResolveRequestCache:缓存模块利用缓存直接对请求进程响应时触发该事件 7、PostResolveRequestCache:缓存模块利用缓存直接对请求进程响应后触发该事件 8、PostMapRequestHandler:对于访问不同的资源类型,ASP.NET具有不同的HttpHandler对其进程处理。对于每个请求,ASP.NET会根据扩展名选择匹配相应的HttpHandler类型,成功匹配后触发该事件 9、AcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)时触发该事件 10、PostAcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)后触发该事件 11、PreRequestHandlerExecute:在实行HttpHandler前触发该事件 12、PostRequestHandlerExecute:在实行HttpHandler后触发该事件 13、ReleaseRequestState:状态管理模块释放基于当前请求相应的状态时触发该事件 14、PostReleaseRequestState:状态管理模块释放基于当前请求相应的状态后触发该事件 15、UpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存时触发该事件 16、PostUpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存后触发该事件 17、LogRequest:为当前请求进程日志记录时触发该事件 18、PostLogReques:为当前请求进程日志记录后触发该事件 19、EndRequest:整个请求处理完成后触发该事件
我们可以在全局配置文件Global.asax中,按照约定的规则Application_{Event Name}来对管道事件定制:
void Application_Start(object sender, EventArgs e) {} void Application_End(object sender, EventArgs e) {} void Application_Error(object sender, EventArgs e) {} void Session_Start(object sender, EventArgs e) {} void Session_End(object sender, EventArgs e) {} ......
ASP.NET MVC请求处理管道生命周期的19个关键环节系列包括:
ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
相关文章推荐
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
- ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
- ASP.NET MVC请求处理管道生命周期
- 【深入ASP.NET原理系列】--ASP.NET请求管道对Asp.Net WebForm和Asp.Net Mvc的处理通用部分
- 综述:ASP.NET MVC请求处理管道
- ASP.NET整体运行机制+asp.net请求管道+页面生命周期+MVC整体运行机制原理图
- ASP.NET MVC请求管道中的19个事件
- 综述:ASP.NET MVC请求处理管道
- 详解ASP.NET MVC的请求生命周期
- IIS处理Asp.net请求和Asp.net页面生命周期说明
- 详解ASP.NET MVC应用程序请求生命周期
- IIS处理Asp.net请求和Asp.net页面生命周期详细说明
- Asp.net请求处理之管道处理介绍
- 为解决ASP.NET MVC(CTP)中URL“页面请求”和“单纯逻辑处理请求”混淆问题,提供一条思路
- ASP.NET请求管道中的19个事件
- Asp.Net MVC请求处理图解
- ASP.NET MVC深度接触:ASP.NET MVC请求生命周期(转)
- ASP.NET MVC深度接触:ASP.NET MVC请求生命周期