ASP.NET
ASP.NET處理架構 > Web伺服器的訊息流動階段

當裝載(hosting) ASP.NET 的 Web 伺服器接收到 HTTP 请求時，HTTP 聆聽程式 (HTTP Listener，实际上是内核态的HTTP.SYS) 會將请求轉交給 URL 指定的網站應用程式池中的工作者进程 (Worker Process)，ASP.NET 的工作者进程接收到这个请求之后，装载专用于处理ASP.NET页面的一个ISAPI扩展“aspnet_isapi.dll”，并将HTTP请求传给它。若是 IIS 5.0 時則是 aspnet_wp.exe。
aspnet_isapi.dll负责加载ASP.NET应用程序的运行环境CLR（IIS 7集成模式下，CLR是预加载的），每个ASP.NET应用程序都运行于自己的应用程序域（AppDomain）中。每个应用程序域都对应着一个ApplicationManager类的实例（通过AppManagerAppDomainFactory创建），负责管理运行在域中的ASP.NET应用程序（启动和停止一个ASP.NET应用程序、创建对象等）。ApplicationManager还会创建一个HostingEnvironment对象，提供了ASP.NET应用程序的一些管理信息（如ASP.NET应用程序的标识、虚拟目录与对应的物理目录等）。
应用程序域创建完成之后，创建 System.Web.Hosting 命名空間中的基于ISAPIRuntime的一个对象，调用其ProcessRequest()方法。在此方法中，根据传入的HTTP请求信息屏蔽了版本差异化后封装实例化了一个HttpWorkerRequest的对象并初始化一个HttpRuntime对象。调用HttpRuntime的ProcessRequestInternal方法。ProcessRequestInternal方法实例化一个HttpContext对象（其构造函数内部又实例化了在ASP.NET编程中非常重要的HttpRequest和HttpResponse对象）、通过HttpApplicationFactory获取HttpApplication对象实例。再调用HttpApplication对象的BeginProcessRequest方法启动整个HTTP请求的处理过程（即HTTP管线模式）。
System.Web.UI.Page类提供了“Requset”和“Response”属性来引用这两个对象，因此在ASP.NET网页中可以直接访问这两个对象。同样，System.Web.UI.Page类的Context属性引用HttpContext对象。
HttpRuntime类的ProcessRequest()方法除了创建HttpContext对象之外，还完成了另一个很重要的工作——向HttpApplicationFactory类的一个实例（它管理一个HttpApplication对象池）申请分配一个HttpApplication对象用于管理整个“HTTP请求处理管线（HTTP Pipeline）”中的各种事件的激发。在HttpApplication对象的InitModules()方法中创建HTTP模块（HTTP Module），通常在HTTP模块对象（实现IHttpModule接口）的Init()方法中响应HttpApplication对象所激发的特定事件。开发者可以创建基于IHttpHandler接口的对象，在Web.Config中插入特定的内容可以将自定义的HTTP模块加入到HTTP请求的处理流程中。 在IIS6和IIS7经典模式下，是用 Event+事件名称做key将所有事件的保存在HttpApplication的Events属性对象里，然后在BuildSteps里统一按照顺序组装。在IIS7集成模式下，是通过HttpModule名称+RequestNotification枚举值作为key将所有的事件保存在HttpApplication的ModuleContainers属性对象里，这个属性的类型是PipelineModuleStepContainer[]。
“HTTP请求处理管线（HTTP Pipeline）”的处理过程为：
预处理阶段：由多个HTTP模块参与，通过事件来驱动，主要是对HttpContext对象的各种属性进行修改。
处理阶段：由System.Web.UI.Page类接手HttpContext对象。Page类实现了IHttpHandler接口，因此有ProcessRequest()方法并被自动调用。ProcessRequest()方法的执行结果刷新了HttpContext对象的内容。
后处理阶段：HttpApplication对象继续激发后继的事件。如果有特定的HTTP模块响应这些事件，则它们会被自动调用。在管线末端，信息傳回到 ISAPIRuntime，以及 aspnet_isapi.dll，最後交由 HTTP Listener 回傳給用戶端。当HTTP请求处理完毕，相关的对象被释放，但创建的应用程序域，以及HttpApplication等对象仍然存活，以响应下一次HTTP请求。
具体的处理管线：
BeginRequest: 开始处理请求。当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件
AuthenticateRequest授权验证请求，获取用户授权信息。当ASP.NET 运行时准备验证用户身份的时候引发这个事件
PostAuthenticateRequest：验证身份成功。通过HttpContext.User获取
AunthorizeRequest 用户权限授权。当ASP.NET运行时准备授权用户访问资源的时候引发这个事件
PostAuthorizeRequest:获得授权
ResolveRequestCache:获取页面缓存结果，如果存在直接返回结果
PostResolveRequestCache 缓存检查结束
MapRequestHandler：IIS7集成模式才支持
查找并创建HttpHandler：根据URL路径或扩展名和匹配规则查找创建，赋值给HttpContext.Handler属性（仅限于IIS6与IIS7经典模式）
PostMapRequestHandler 成功创建IHttpHanlder对象
AcquireRequestState 获取请求状态，一般用于获取Session：先判断当前页面对象是否实现了IRequiresSessionState接口，如果实现了，则从浏览器发来的请求报文体中获得SessionID,并到服务器的Session池中获得对应的Session对象，最后赋值给HttpContext的Session属性
PostAcquireRequestState 成功获得Session
PreRequestHandlerExecute:准备执行HttpHandler处理程序。
执行HttpHandler处理程序（仅限于IIS6与IIS7经典模式）：调用HttpHandler的ProcessRequest方法（同步）或BeginProcessRequest方法（异步）。
PostRequestHandlerExecute 执行HttpHandler处理程序结束。
ReleaseRequestState 准备释放请求状态（Session）
PostReleaseRequestState 成功释放请求状态（Session）
Filter：将内容写入Filter（仅限于IIS6与IIS7经典模式）
UpdateRequestCache 更新缓存
Filter：将内容写入Filter（仅限于IIS7集成模式）
PostUpdateRequestCache 已更新缓存
LogRequest 为当前请求执行日志记录（仅限于IIS7集成模式）
PostLogRequest 已完成日志（仅限于IIS7集成模式）
EndRequest 完成。把响应内容发送到客户端之前引发这个事件。
Noop：扩展使用（仅限于IIS6与IIS7经典模式）
PreSendRequestHeaders：根据发送的Headers动态设置一些参数（仅限于IIS7集成模式）
PreSendRequestContent：可对输出内容做压缩（仅限于IIS7集成模式）
在 ASP.NET 內部的 HTTP 處理器有：
ISAPIRuntime：由 aspnet_isapi.dll 呼叫，初始化 HttpWorkerRequest 物件（會由IIS的版本決定要初始化的版本）。
HttpRuntime：提供请求佇列 (Request Queue)、呼叫 HttpWorkerRequest 中的 ProcessRequest() 方法，以及後續的處理工作。
HttpWorkerRequest：產生 HttpApplication、HttpRequest、HttpResponse 等基礎物件的 HTTP 请求物件，並將要求轉送到要處理的物件（並呼叫它的 ProcessRequest() 方法）。
IHttpHandler 與 IHttpAsyncHandler：負責處理 HTTP 请求的單元，由 ProcessRequest() 來分派與執行请求。