HTTP运行期
HTTP运行期处理客户端应用程序(例如Web浏览器)进入的一个Web请求,通过处理它的应用程序的适当组件路由请求,然后产生响应并发回提出请求的客户端应用程序。
进入的HTTP Web请求最先由IIS Web服务器接收到,它在此请求基于ASP.NET已注册处理的扩展名传送到ASP.NET ISAPI上。
HTTP运行期首先创建一个HttpContext对象的实例,它包含了当前正在处理的请求信息,接着创建在处理逻辑中涉及到的所有其他组件都可以使用的上下文对象。HttpContext实例提供了对请求对象(HttpRequest类的实例)和响应对象(HttpResponse类的实例)的访问。
HTTP运行期集成由称为HTTP模块(HTTP Module)的组件构成的处理管线,用于执行请求预处理动作(如:高速缓存的查询和授权)和后处理动作(如:更新调整缓存)。这些组件实现IHttpModule接口。在管线中,每个模块处理不同的全局应用层次和特定请求事件来执行其逻辑。
HTTP运行期基于请求的URL还选择一个HTTP处理程序(实现IHttpHandler接口的组件)或HTTP处理程序工厂(实现IHttpHandlerFactory接口的组件)来完成引入请求的实际处理过程。处理程序用HttpContext对象来收集请求信息、并写出响应的结果。
图1:ASP.NET Web 应用程序中的请求处理过程
一个HTTP请求的处理过程
当一个HTTP请求被送入HttpRuntime之后,这个HTTP请求会继续被送入到一个被称为HttpApplicationFactory的容器中。而这个窗口会给出一个HttpApplication实例来处理传递进来的HTTP请求,而后这个HTTP请求会依次进入如下几个容器中:
HttpModule ——> HttpHandler Factory ——> HttpHandler
当系统内部的HttpHandler的ProcessResquest的方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的结果了。
一个完整的HTTP请求在ASP.NET Framework的处理过程如下:
HttpRequest ——> inetinfo.exe ——> ASPNET_ISAPI.dll ——> Http Pipeline ——> ASPNET_WP.exe ——> HttpRuntime ——> HttpApplication Factory ——> HttpApplication ——> HttpModule ——> HttpHandler Factory ——> HttpHandler ——> HttpHandler.ProcessRequest()
页面执行模型
页面执行模型由页面HTTP处理程序工厂开始,它注册HTTP运行期以为所有.aspx文件处理请求。页面处理程序工厂负责创建一个Page对象的实例,这是将最终处理请求所生成响应结果的HTTP处理程序。
首先页面处理程序工厂尝试在与请求的.aspx文件相关的.NET高速缓存内查找以前编译过的页面类。当查找失败时,就像第一次请求一样,处理程序工厂将读取和解析文件,并创建一棵解析树(parse tree)。解析树类似于控件树,但是并不包含控件,解析树包含称为控件生成器(control builder)的对象实例。控件生成器包含了在解析过程期间收集的相关控件信息。然后通过Page指令中的Language attribute,用与页面相关的语言把解析树转变为代码。然后,页面处理程序工厂调用适当的编译程序,动态地编译从Page中得到的类,页面处理程序工厂还将新建的类放置到ASP.NET调整缓存中,并且把高速缓存记录和文件相关性关联起来。文件相关性监视.aspx文件做出的变化,并保证任何变化都自动地使高速缓存记录无效,在下次请求时这些记录将再次解析修改过的文件。
图2:页面如何处理请求
参考资料
《ASP.NET服务器控件与组件开发》
《ASP.NET深入解析》