Http请求到达IIS时发生什么
当请求到达iis时,iis首先要确定如何处理请求。判断的依据就是请求文件的后缀,iis根据文件后缀名确定由谁去处理此次请求。IIS本身可以处理某些类型的请求,如HTML 页面、图像以及其他静态内容等,或者将请求路由到ISAPI扩展(Internet Server Application Programe Interface,互联网服务器应用程序接口),由ISAPI扩展响应此请求。例如,asp.net页面路由到aspnet_isapi.dll ISAPI扩展,由该扩展响应页面请求。ISAPI扩展响应结束后,将结果返回给IIS,最终由IIS将结果(HTML页面)返回给客户。
ISAPI扩展是非托管的编译类,该类的主要作用就是响应某种类型的http请求,并将结果返回给IIS。从本质上讲,ISAPI并不是真正的应用程序,而只是一种接口,用于影射某种类型的页面或文件与实际处理程序之间的对应关系。
ISAPI 筛选器,像ISAPI 扩展一样,是在 Web 服务器接收到 HTTP 请求时进行响应的程序。但不同于 ISAPI 扩展,ISAPI 筛选器总在服务器进程中运行。ISAPI 筛选器不同于应用程序,因为它们是由 Web 服务器事件驱动,而不是由客户端请求驱动的。可以将 ISAPI 筛选器与特定 Web 服务器事件关联;每次发生关联事件时都将通知筛选器。例如,当读或写事件发生时将通知筛选器并由其对将返回给客户端的原始数据进行加密。ISAPI 筛选器可以应用于很多方面,包括: 身份验证和授权、记录和监视、HTTP 压缩、URL 重写。。。。
管道(Pipeline)
当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(Managed Modules)和处理程序(Handlers)组成,并且由管道来处理这个 Http请求。
1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。、
2. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些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请求可以经过多个module,但是最后只能被一个handler处理