源码解析HttpApplicationFactory类的功能
一、综述:
HttpApplicationFactory类的主要作用是创建并且管理用于处理Http请求的HttpApplication对象。
HttpApplication是ASP.NET Pipline(管道)的载体,管理了请求的整个生命周期。正是在这个类里,ASP.NET以管道的模式处理所有的请求。
HttpApplication将管道处理的不同阶段要处理的事情以事件的方式对外开放,关注某事件Module(模块)在自己的内部注册这些事件,
然后HttpApplication对象根据http请求所处的不同阶段,分别触发这些事件,完成对http请求的处理。
如SessionStateModule模块就注册了获取状态和发布状态的事件。获取状态事件被触发时,该模块会获取一个Session对象,赋值给HttpContext对象,这样在
执行处理程序阶段,我们就可以访问Session对象进行存取数据(对于MVC5,这个过程是在控制器的Action中)。等到了发布状态事件时,该模块会根据适当的情况,
将Session中的数据持久保存起来,然后将Session对象从HttpContext对象中删除。已在其他随笔里介绍了SessionStateModule模块的核心功能。
当然在这里只是简单介绍HttpApplication的作用,该类的功能十分强大完善,但也特别复杂,所以会在另外的随笔里单独介绍。
在这里介绍HttpApplication只是为了引出HttpApplicationFactory。
二、详细介绍:
HttpApplicationFactory内部使用了Stack(栈)来存储多个HttpApplication对象。
主要功能如下:
1、创建存储HttpApplication对象,包括循环使用等。
2、将我们在Global.asax文件中定义的事件整理出来,然后在HttpApplication初始化时传递初始化方法。在下面的示例代码中,我们注册了请求开始事件,
这个事件将会向文档中输出一句话,而这句话也会显示在我们的网页里。
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start() 4 { 5 AreaRegistration.RegisterAllAreas(); 6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 7 RouteConfig.RegisterRoutes(RouteTable.Routes); 8 BundleConfig.RegisterBundles(BundleTable.Bundles); 9 } 10 11 protected void Application_BeginRequest(object sender,EventArgs e) 12 { 13 HttpApplication application = sender as HttpApplication; 14 HttpResponse resp = application.Context.Response; 15 resp.Write("<h1>要开始处理请求了;</h1>"); 16 } 17 }
我们在