ASP.NET 处理请求的过程
- inetinfo.exe:www 服务进程,IIS 服务 和 ASPNET_ISAPI.dll 都寄存在此进程中。
- ASPNET_ISAPI.dll:处理 .aspx 文件的 win32 组件。其实,IIS 服务器只能识别 .html 文件的,当发现被请求的文件是 .aspx 文件时,IIS 服务器将其交给 aspnet_isapi.dll 来处理。
- aspnet_wp.exe 进程:ASP.NET 框架进程,提供 .net 运行的托管环境,CLR (公共语言运行时)就是寄存在此进程中。
ASP.NET Framework 处理一个 Http Request 的流程:
HttpRequest → inetinfo.exe → ASPNET_ISAPI.dll → ASPNET_WP.exe → HttpRuntime → HttpApplication Factory → HttpApplication → HttpModule → HttpHandler Factory → HttpHandler → HttpHandler.ProcessRequest()
ASP.NET 请求处理过程是基于管道模型的,ASP.NET 把 http 请求依次传递给管道中各个 HttpModule,最终被 HttpHandler 处理,处理完成后,再次经过管道中的 HttpModule,把结果返回给客户端。注意:在 http 请求的处理过程中,只能调用一个 HttpHandler,但可以调用多个 HttpModule。
在每个 HttpModule 中都可以干预请求的处理过程。当请求到达 HttpModule 的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,截获这个请求并作一些额外的工作,或者终止请求等。在 HttpHandler 处理完请求之后,我们也可以再在相应的 HttpModule 中把请求处理的结果进行再次加工后返回客户端。
HttpModule
HttpModule 是实现了 System.Web.IhttpModule 接口的类。IHttpModule 接口的声明:
public interface IHttpModule
{
// 给予 HTTP 模块在对象被垃圾收集之前执行清理的机会,一般无需编写代码。
void Dispose();
// 初始化时自动调用,可在这里向 HttpApplication 对象中的事件注册自己的事件处理程序
void Init(HttpApplication context);
}