管道模型

 ASP.NET请求过程-Module   ASP.NET请求过程-Module

上图中为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);
        }
GetApplicationInstance

相关文章:

  • 2022-01-15
  • 2022-01-07
  • 2021-11-17
  • 2021-06-25
  • 2022-01-13
  • 2022-03-08
猜你喜欢
  • 2021-11-10
  • 2021-06-27
  • 2022-12-23
  • 2022-01-23
  • 2022-12-23
  • 2021-07-31
  • 2021-05-31
相关资源
相似解决方案