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)的更多相关文章

  1. ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...

  2. ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...

  3. Asp.net MVC 之请求生命周期

    今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识. 这里主要研究了MVC请求的五个过程. 1.创建RouteTable 当ASP.NE ...

  4. ASP.NET MVC 小牛之旅4:ASP.NET MVC的运行生命周期

    ASP.NET MVC的运行生命周期大致分成三大过程:(1)网址路由对比. (2)运行Controller与Action. (3)运行View并回传结果. 4.1网址路由对比 当iis收到http请求 ...

  5. 你真的熟悉ASP.NET MVC的整个生命周期吗?

    一.介绍 我们做开发的,尤其是做微软技术栈的,有一个方向是跳不过去的,那就是MVC开发.我相信大家,做ASP.NET MVC 开发有的有很长时间,当然,也有刚进入这个行业的.无论如何,如果有人问你,你 ...

  6. 详解ASP.NET MVC的请求生命周期

    本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...

  7. ASP.NET MVC的请求生命周期

    我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...

  8. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

    好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...

  9. ASP.Net MVC请求处理流程

    ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...

随机推荐

  1. Linux下的虚拟Bridge实现

    http://www.cnblogs.com/zmkeil/archive/2013/04/21/3034733.html Linux下的Bridge也是一种虚拟设备,这多少和vlan有点相似,它依赖 ...

  2. mac上的git completion

    只安装bash-completion,是没有git补全的,因为此时/usr/local/etc/bash-completion.d/下面没有git-XXX.sh 解决方法是brew install g ...

  3. listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.

    1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...

  4. RHEL7学习之NTP配置

    一,安装NTP [root@localhost ~]# yum install ntp Loaded plugins: product-id, subscription-manager This sy ...

  5. PHP测试用例文档

    PHP接口测试用例和文档 PHP在过程中的测试 采用写一个简单html表单做一个简单的post测试 PHP接口测试文档 Alpha部分主要的接口文档可查看 接口文档 功能模块 接口 登录注册模块 验证 ...

  6. 【Java】:压缩成多个压缩卷

    Java自带的库不支持压缩成多个压缩卷,找到了一个开源库 zip4j ,发现更好用 so easy package com.jws.common.mail; import java.io.File; ...

  7. prism4 StockTrader RI 项目分析一些体会

    StockTrader RI 代码分析也有一段时间了 刚从codeplex获取到源代码的时候,看得一头雾水,不知所云(因为之前没做过wpf的项目,看文档也静不下那心来看) 后来就想了个笨办法,模拟项目 ...

  8. 1214 - Large Division -- LightOj(大数取余)

    http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...

  9. 通过硬编码获取dubbo服务对象

    运维进行监控dubbo服务的时候可能会调用dubbo服务对象,并且定期去执行,这时候如果需要添加新的服务,可能需要修改监控dubbo服务的配置,即dubbo-producer.xml或是dubbo-c ...

  10. 一台MySQL服务器启动多个端口

    一台MySQL服务器启动多个端口 在测试Mysql多主一从服务器,即一个从服务器多端口同步不同主库.本文记录了开启不同端口的操作. 详细步骤: 1.首先要先把my.cnf配置文件复制一份,开几个端口要 ...