ASPNET管道()
以IIS 为例在工作进程wwpexe中利用aspnet_isapidll加载NET运行时(如果NET运行时尚未加载)IIS 引入了应用程序池的概念一个工作进程对应着一个应用程序池一个应用程序池可以承载一个或多个Web应用每个Web应用映射到一个IIS虚拟目录与IIS x一样每一个Web应用运行在各自的应用程序域中
如果HTTPSYS接收到的HTTP请求是对该Web应用的第一次访问在成功加载了运行时后会通过AppDomainFactory为该Web应用创建一个应用程序域随后一个特殊的运行时IsapiRuntime被加载IsapiRuntime定义在程序集SystemWeb中对应的命名空间为SystemWebHosting被加载的IsapiRuntime会接管该HTTP请求
IsapiRuntime会首先创建一个IsapiWorkerRequest对象用于封装当前的HTTP请求并将该IsapiWorkerRequest对象传递给ASPNET运行时HttpRuntime从此时起HTTP请求正式进入了ASPNET管道HttpRuntime会根据IsapiWorkerRequest对象创建用于表示当前HTTP请求的上下文(Context)对象HttpContext
随着HttpContext被成功创建HttpRuntime会利用HttpApplicationFactory创建新的或获取现有的HttpApplication对象实际上ASPNET维护着一个HttpApplication对象池HttpApplicationFactory从池中选取可用的HttpApplication用于处理HTTP请求处理完毕后将其释放到对象池中HttpApplicationFactory负责处理当前的HTTP请求
在HttpApplication初始化过程中会根据配置文件加载并初始化相应的HttpModule对象对于HttpApplication来说在它处理HTTP请求的不同阶段会触发不同的事件(Event)而HttpModule的意义在于通过注册HttpApplication的相应的事件将所需的操作注入整个HTTP请求的处理流程ASPNET的很多功能比如身份验证授权缓存等都是通过相应的HttpModule实现的
最终完成对HTTP请求的处理实现在HttpHandler中对于不同的资源类型具有不同的HttpHandler比如aspx页面对应的HttpHandler为SystemWebUIPageWCF的svc文件对应的HttpHandler为SystemServiceModelActivationHttpHandler上面整个处理流程如图所示
图 ASPNET 处理管道
HttpApplication
HttpApplication是整个ASPNET基础架构的核心它负责处理分发给它的HTTP请求由于一个HttpApplication对象在某个时刻只能处理一个请求只有完成对某个请求的处理后HttpApplication才能用于后续的请求的处理所以ASPNET采用对象池的机制来创建或获取HttpApplication对象
当第一个请求抵达时ASPNET会一次创建多个HttpApplication对象并将其置于池中选择其中一个对象来处理该请求处理完毕后HttpApplication不会被回收而是释放到池中对于后续的请求空闲的HttpApplication对象会从池中取出如果池中所有的HttpApplication对象都处于繁忙的状态ASPNET会创建新的HttpApplication对象
HttpApplication处理请求的整个生命周期是一个相对复杂的过程在该过程的不同阶段会触发相应的事件我们可以注册相应的事件将处理逻辑注入到HttpApplication处理请求的某个阶段表按照实现的先后顺序列出了HttpApplication在处理每一个请求时触发的事件名称
表 HttpApplication事件列表
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战