了解ASP.NET的运行事模型(HTTPRuntime)

为什么要去了解ASP.NET运行时模型(HTTPRuntime

在学习ASP.NET之前,最好先学习一下ASP.NET的运行时模型,其实ASP.NET的编程模型分为ASP.NET的运行时模型和页面变成模型。许多的参考书只是直接的介绍ASP.NET的页面编程模型,而忽略了运行时模型,页面编程模型是ASP.NET程序员主要做的事情,但在做这些工作之前,充分的了解运行时模型,有利于我们去了解整个ASP.NET程序的生命周期,能让程序员更好的去了解程序中每个变量、对象的生命周期,让程序员更好的去控制ASP.NET程序中的变量、对象。

 

了解ASP.NET运行时模型的必备基础:

l         IIS运行过程(IIS6.0之前,IIS7.0有较大变动)

当我们在浏览器中输入一个网址是,浏览器通过Http协议,将请求信息发送给IIS服务器,IIS在接受到请求之后,IIS 首先需要决定如何去处理这个请求(NOTEWEB服务器处理一个.htm页面和一个.aspx页面肯定是不一样的)。那IIS依据什么去处理呢?―― 根据檔的后缀名。

处理不同后缀名的檔需要不同的处理程序,IIS是如何知道处理各种后缀名的应用程序,好比说现在我们请求一个后缀为aspx的页面(其实IIS本身并不能处理这些aspx页面请求),它需要一种映射机制,就是将各种后缀名的页面映射到不同的处理程序,然后调用这些程序来处理这些页面檔,这里的映像机制就是ISAPI(互联网服务应用程序接口),在配置IIS服务器的时配置ISAPI是必须,要不然IIS是无法处理aspx的页面请求(即ASP.NET的应用程序)。

接下来会在WEB服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的檔,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个档返还给客户端。如果找到,就是处理之后,再将处理后的页面信息发送给客户端。

l        理解宿主环境(Hosting

ASP.NET是由一些列的类组成的,他们的主要任务就是将HttpRequest(即客户端发送的请求)请求转换为客户端得回应(HttpResponse, HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryStringHttp 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的檔,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。

Web.config(配置文件)文件的内容发生改变 或者 .aspx文件发生变动的时候,为了能够卸载运行在同一个进程中的应用程序(NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中(NOTE:可能你以前就听过应用程序域,但是不了解怎么回事,应用程序域就是 AppDomain)。

对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。(NOTE:实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:为什么你访问不存在的檔会出现 404 错误呢?就是在这一步确定的。)如果请求的是一个可访问的URLHTTP.SYS会将这个请求交给 IIS 工作者进程。 NOTEIIS6.0中叫做 w3wp.exeIIS5.0中叫做 aspnet_wp.exe)。 每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。( NOTE:可选性能参数,是指诸如 回收机制的设置、超时时间设置 等等。)

    在此需在提一下ISAPI,之前说ISAPI是用用映像文件与其对应的处理程序,其实在此,它哈有一下几个工作:

1)  HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。

2)  在相互隔离的应用程序域AppDomain中加载HttpRuntime

3)  调用 HttpRuntimeProcessRequest方法。

接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

1.Asp.Net 的宿主环境

l        理解管道(Pipeline

通过前面的介绍,基本已经了解从浏览器发送请求到浏览器接受到应答信息,这期间主要是IISFramework的工作,你也许很迷茫,我们自己写的程序到底去哪儿了,难道不用去处理了?——答案是否定的。肯定是要去处理的,管道就是来做这一部分的衔接。 Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTEManaged Modules)和处理程序(NOTEHandlers)组成,并且由管道来处理这个 Http请求。

图2. 理解 Http 管道

1. HttpRuntimeHttp请求转交给 HttpApplicationHttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequestHttpResponseHttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。

 2. 接下来Http请求通过一系列Module,这些ModuleHttp请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情。

 3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:

public class Page : TemplateControl, IHttpHandler

 可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。

 4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。

  如果我们将注意力只集中在Http请求、HttpHandlerHttpModule上,不去考虑HttpContextHttpApplication,那么图2.可以简化成下面这样:

3.Http请求在HttpHandler HttpModule 中的流动方向

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值