http请求处理流程(讲的很清楚)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.NET平台处理HTTP请求
.NET平台处理HTTP请求的过程大致如下:
1、IIS得到一个请求;
4、.NET运行时被加载;
5、非托管代码调用IsapiRuntime.ProcessRequest()方法;
6、每一个请求调用一个IsapiWorkerRequest;
7、使用WorkerRequest调用HttpRuntime.ProcessRequest()方法;
8、通过传递进来的WorkerRequest创建一个HttpContext对象
9、通过把上下文对象作为参数传递给
HttpApplication.GetApplicationInstance(),然后调用该方法,从应用程序池中获取一个HttpApplication实例;
10、"调用HttpApplication.Init(),启动管道事件序列,钩住模块和处理器;
11、"调用HttpApplicaton.ProcessRequest,开始处理请求;
12、"触发管道事件;
13、"调用HTTP处理器和ProcessRequest方法;
14、"把返回的数据输出到管道,触发处理请求后的事件。
当一个HTTP请求被送入到HttpRuntime之后,这个HTTP请求通过HTTP管道(HttpRuntime是HTTP管道的入口)被送入到一个被称之为HttpApplicationFactory的一个容器当中,而这个容器会给出一个HttpApplication 实例来处理传递进来的HTTP请求,同时HttpApplication实例会创建一个
HttpContext对象来记录HTTP请求的上下文,而后这个HTTP请求会依次进入到如下几个容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个HttpRequest就被处理完成了。
如果想在中途截获一个HttpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
过程详解:
从本质上讲,主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是的一个主要入口,它有一个ProcessRequest方法,这个方法以一个HttpWorkerRequest类作为参数。
HttpRuntime类几乎包含着关于单个Http请求的所有信息:
所请求的文件、服务器端变量、QueryString、Http头信息等等。使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,就是HTML页面;二般来说,也可以是张图片^_^。
对于IIS来说,它依赖于一个叫做HTTP.SYS的内置驱动程序来监听来自外部的HTTP请求。在系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径(实际上相当于告诉HTTP.SYS哪些URL是可以访问的,哪些是不可以访问的。举个简单的例子:
为什么你访问的文件不存在时会出现404错误呢?就是在这一步确定的)。
除了映射文件与其对应的处理程序以外,ISAPI还需要做一些其他的工作:
1.从HTTP.SYS中获取当前的Http请求信息,并且将这些信息保存到
HttpWorkerRequest类中。
2.在相互隔离的应用程序域AppDomain中加载HttpRuntime。
3.调用HttpRuntimeProcessRequest方法。
接下来就是程序员编写的代码(C#)所完成的工作了,然后,IIS接收返回的数据流,并重新返还给HTTP.SYS,最后,HTTP.SYS再将这些数据返回给客户端浏览器。
名词解释:
IIS:
IIS的4个核心组件:
HTTP.sys:
将HTTP请求传送到用户模式应用程序的内核模式设备驱动程序。
WWW服务管理和监视组件:
配置“万维网发布服务”(WWW服务)并管理工作进程。
工作进程:
处理提交到分配给它们的Web应用程序的请求。
主控配置数据库和非Web服务。
MSIL:
MicrosoftIntermediateLanguage,微软中间语言。MSIL是将.Net代码转化为机器语言的一个中间过程,它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。同一段MSIL代码可以被不同的编译器实时编译并运行在不同的结构上,因此MSIL本身与机器无关,可以在装有CLR的任一计算机上运行。
CLR:
CommonLanguageRuntime,公共语言运行时。简单的理解,就是一个翻译,把.NET平台的各种语言(C#、V
B、JS等)翻译为机器可以执行的语言。.NET编译器将程序代码编译成MSIL(Microsoft Intermediate Language,微软中间语言),然后再由CLR中的
JIT(Just In Time,实时)编译器去编译成机器语言来执行。CLR在功能上就如同一块虚拟的CPU,它执行MSIL代码、操作数据。CLR和真实CPU的类似之处在于它们都不直接操作内存中的变量而是使用程序变量的临时拷贝,CLR把这些程序变量存放在堆栈上。从内存拷贝某个变量到堆栈的行为称作装载(loading),而从堆栈拷回某个变量到内存的行为则被称作存储(storing)。
HttpRuntime:
配置 HTTP运行时设置,这些设置确定如何处理对应用程序的请求,HttpRuntime类几乎包含了单个HTTP请求的所有信息,HttpRuntime 是HTTP管道的入口。HTTP请求到达时,将运行时库加载到要处理请求的进程中,还为将在Web服务器上运行的每个Web应用程序创建一个应用程序域(AppDomain)。HttpRuntime的ProcessRequest方法驱动所有后续的 WEB处理。
AppDomain:
AppDomain对象表示应用程序域,即一个应用程序执行的独立环境,为执行托管代码提供隔离、卸载和安全边界。它是是微软基于.NET框架设计的概念,找不到其他技术体系中贴切的参照概念。辅助进程为每个当前正在运行的应用程序维护一个特定的AppDomain。一个进程中可以有多个AppDomain,但是一个AppDomain只能存在于某个进程中。线程执行可以涉及多个AppDomain,但某个特定时刻线程仅存在于一个AppDomain中,且线程可以进入其他的AppDomain。
哪些情境下要使用AppDomain: