ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节。
①以IIS6.0为例,首先由w3wp.exe维护着一个工作进程

②如果是第一次加载,由Aspnet_isapi.dll加载.NET运行时

③一个工作进程里有一个应用程序池,其中可以承载多个应用程序域AppDomain

④HTTP.SYS接收请求,通过应用程序域工厂AppDomainFactory创建应用程序域AppDomain

⑤一个IsapiRuntime被加载,并创建一个IsapiWorkerRequest对象封装当前的HTTP请求,并把该IsapiWorkerRequest对象传递给ASP.NET的HttpRuntime运行时,此时, HTTP请求开始进入ASP.NET请求管道

也就是说,HttpRuntime是ASP.NET请求管道的入口。当请求进来,首先进入HttpRuntime,由HttpRuntime来决定如何处理请求。默认情况下,在machine.config和Web.config中并没有显式定义httpRuntime节点,但该节点是有默认值的,如下:
<httpRuntime
apartmentThreading="false"
appRequestQueueLimit=""
delayNotificationTimeout=""
enable="true"
enableHeaderChecking="true"
enableKernelOutputCache="true"
enableVersionHeader="true"
encoderType = "System.Web.Util.HttpEncoder"
executionTimeout=""
maxQueryStringLength = ""
maxRequestLength=""
maxUrlLength = ""
maxWaitChangeNotification=""
minFreeThreads=""
minLocalRequestFreeThreads=""
relaxedUrlToFileSystemMapping = "False"
requestLengthDiskThreshold=""
requestPathInvalidCharacters = "<,>,*,%,&,:,\"
requestValidationMode = "4.0"
requestValidationType = "System.Web.Util.RequestValidator"
requireRootedSaveAsPath="true"
sendCacheControlHeader="true"
shutdownTimeout=""
useFullyQualifiedRedirectUrl="false"
waitChangeNotification="" />
通常,我们可以在Web.config中更改httpRuntime节点的默认值,如下:
<configuration>
<system.web>
<httpRuntime maxRequestLength=""
enable = "True"
requestLengthDiskThreshold="
useFullyQualifiedRedirectUrl="True"
executionTimeout=""
versionHeader="1.1.4128"/>
</system.web>
</configuration>
⑥HttpRuntime维护着一个HttpApplication池,当有HTTP请求过来,从池中选取可用的HttpApplication处理请求

HttpApplication有19个管道事件,分别是:
、BeginRequest:HTTP管道开始处理请求时,会触发BeginRequest事件
、AuthenticateRequest:安全模块对请求进行身份验证时触发该事件
、PostAuthenticateRequest:安全模块对请求进行身份验证后触发该事件
、AuthorizeRequest:安全模块对请求进程授权时触发该事件
、PostAuthorizeRequest:安全模块对请求进程授权后触发该事件
、ResolveRequestCache:缓存模块利用缓存直接对请求进程响应时触发该事件
、PostResolveRequestCache:缓存模块利用缓存直接对请求进程响应后触发该事件
、PostMapRequestHandler:对于访问不同的资源类型,ASP.NET具有不同的HttpHandler对其进程处理。对于每个请求,ASP.NET会根据扩展名选择匹配相应的HttpHandler类型,成功匹配后触发该事件
、AcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)时触发该事件
、PostAcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)后触发该事件
、PreRequestHandlerExecute:在实行HttpHandler前触发该事件
、PostRequestHandlerExecute:在实行HttpHandler后触发该事件
、ReleaseRequestState:状态管理模块释放基于当前请求相应的状态时触发该事件
、PostReleaseRequestState:状态管理模块释放基于当前请求相应的状态后触发该事件
、UpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存时触发该事件
、PostUpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存后触发该事件
、LogRequest:为当前请求进程日志记录时触发该事件
、PostLogReques:为当前请求进程日志记录后触发该事件
、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个关键环节(7-12)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- Asp.net MVC 之请求生命周期
今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识. 这里主要研究了MVC请求的五个过程. 1.创建RouteTable 当ASP.NE ...
- ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期
ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...
- 你真的熟悉ASP.NET MVC的整个生命周期吗?
一.介绍 我们做开发的,尤其是做微软技术栈的,有一个方向是跳不过去的,那就是MVC开发.我相信大家,做ASP.NET MVC 开发有的有很长时间,当然,也有刚进入这个行业的.无论如何,如果有人问你,你 ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
- ASP.NET MVC的请求生命周期
我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...
- ASP.Net MVC请求处理流程
ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...
随机推荐
- C/C++中extern关键字解析
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- Android Studio使用JNI和NDK进行开发
想要学习一下在Android Studio中进行JNI的开发,文章挺多的,但是几乎没有一个完整的说明的,中间总是有一两步漏掉.分享技术就应该完整的让读者学会,藏着掖着不是君子所为.对于那些故意含糊过去 ...
- 动态加载jar包中的类(方式一)
嘛, 直接上代码 public static class TestClassLoader extends ClassLoader { @Override protected Class<?> ...
- visul studio 文件分包
1.搜索算法. 2.软件控制逻辑. 3.自定义控件. 4.GUI模块. 5.线程化操作
- Laravel 5.x 启动过程分析 [转]
1.初始化Application 1.1 注册基本绑定 app -> Application实例(Illuminate\Foundation\Application) Illuminate\Co ...
- DB2死锁的解决办法
db2 get snapshot for locks on sampledb2 get db cfg for sampledb2 update db cfg using dlchktime 10000 ...
- 运用requirejs的异步加载方式
很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...
- 数字与字母 随机数小demo
public String generateRandomId(){ String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI ...
- android书籍
教程 源码下载 高薪招聘 Cocos2d-x 博客 签到 视频教程 wiki 帖子 搜索 热搜:二维码定时器手电筒滑块斗地主书架定位买手机聊天游戏开发游戏股票查询机顶盒通话记录二维码扫描振动器 ...
- centos 如何清理/dev/vda1系统盘
df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr 2.du -sh * 看哪个目录占用空间大 3.重复前两步,根据实际情况删除或者移走 4.日志的话可以运行 ...