管道模型
上图中为Http请求在Asp.net程序中处理的过程。管道处理模型来自上面的HttpApplication,管道处理模型其实就是多个Module(其实这些module都是在往httpapplicatioin里面的事件注册方法 是一个观察者模式) 加一个Handler(Asp.net中所有的请求都会有一个且只有一个handler处理),处理过程就是 请求经过一系列module到达handler 然后handler处理我们的业务代码 然后在经过另外一系列module返回 所有处理的信息都放在httpcontext。一般程序员写的程序全部在Handler中(webform),webform中页面都继承了page类,这个类继承了IHttpHandler。但是在asp.net mvc中控制器并没有继承IHttpHandler,但是在控制器中有一个属性。
HttpApplication、事件
HttpApplication定义:定义 ASP.NET 应用程序中的所有应用程序对象共有的方法、属性和事件。此类是用户在 Global.asax 文件中所定义的应用程序的基类。
每一个用户请求过来,HttpApplicationFactory都会分配一个HTTPApplication对象(这里有一个对象池的概念),
HttpApplication特点:
HttpApplication对象是经由HttpApplicationFactory.GetApplicationInstance(并最终调用HttpRuntime.CreateNonPublicInstance)创建的HttpApplicationFactory它的主要任务是使用 URL 信息来查找 URL 虚拟目录和汇集的 HttpApplication 对象之间的匹配关系。
1、工厂类维护, HttpApplication 对象池并使用它们来处理应用程序的请求。池的寿命与应用程序的寿命相同。
2、应用程序的第一个请求到达时,工厂类(工厂类和HTTPRuntime都是单例的)提取有关应用程序类型的信息(global.asax 类)、设置用于监视更改的文件、创建应用程序状态并触发 Application_OnStart 事件(因为HttpApplicationFactory中有一个静态属性(bool值)记录是否第一次调用,每次创建GetApplicationInstance都会检查这个属性 确定是否执行Application_OnStart 具体可以查看源码)。工厂类从池中获取一个 HttpApplication 实例,并将要处理的请求放入实例中。如果没有可用的对象,则创建一个新的 HttpApplication 对象。要创建 HttpApplication 对象,需要先完成 global.asax 应用程序文件的编译。
internal static IHttpHandler GetApplicationInstance(HttpContext context) { if (HttpApplicationFactory._customApplication != null) { return HttpApplicationFactory._customApplication; } if (context.Request.IsDebuggingRequest) { return new HttpDebugHandler(); } HttpApplicationFactory._theApplicationFactory.EnsureInited(); HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context); return HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context); }