欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVC中Asp.Net管道(二)

程序员文章站 2022-03-04 13:08:57
...

   Asp.Net管道:

   1.在工作进程w3wp.exe中,利用asp.net_isapi加载.NET运行时,6.0中引入了应用程序池的概念,一个工作进程对应的一个应用程序池。一个应用呢程序池可以加载一个和多个Web应用,每个Web应用映射到IIS的虚拟目录。(每个Web应用运行在各自的应用程序池)

   2.HTTP.SYS接受的HTTP请求是Web的第一次访问,在成功加载运行时后,通过AppDomainFactory创建一个应用程序域,随后加载IsapiRuntime被加载----接管该HTTP请求。

   3. IsapiRuntime首先创建一个IsapiWorkerRequest对象-----1.封装当前的HTTP请求。  2.将该对象传递给Asp.Net运行时HttpRuntime  (正式进入了HTTP请求的管道)

   4.HttpRuntime根据IsapiWorkerRequest 创建当前HTTP请求的上下文对象(HTTPContext)

   5.Asp.net维护着一个HttpAppliation对象池。HttpApplicationFactory负责处理当前的HTTP请求

   6.HttpApplication初始化过程中,根据配置文件加载和初始化相应的HttpModel对象

   7.HttpApplication来说,处理HTTP的不同阶段会触发不同的事件(Event)。HttpModel通过注册HttpApplication的相应事件,将所需的操作注入整个HTTP请求处理的流程(身份验证、授权、缓存)都是通过相应的HTTPModel实现的

   8.HttpHandler最终实现对HTTP的请求

流程如图:

 

HttpApplication

   1.是Asp.Net架构的核心----负责处理分发给他的Http请求,在某一时刻只能处理一个请求,所以采用了对象池的机制来创建和获取HttpApplication对象。处理完毕后HttpApplication不会被回收,而是释放到池中。

   2.HttpApplication派生于Global.asax文件。

HttpModule

       HttpModule使得Asp.Net具有高度可扩展性的引擎。请求转入管道时。最终负责请求处理的是与请求资源类型匹配的HttpHandler对象。在Handler正式工作之前,Asp.Net会加载并初始化所有配置的HttpModel对象。HttpModel在初始化的过程中,会将一些功能注册到HttpApplication相应的事件中。

所有的HttpModel都实现了System.Web.IHttpModel接口,其中Init方法用于实现HttpModule自身的初始化,该方法接受一个HttpApplication对象

 

Asp.Net提供的很多基础的功能都是通过相应的HttpModel实现(典型的)

1.OutputCacheModule:实现输出缓存的功能

2.SessionStateModule:在无状态的Http协议上实现了基于会话(Session)的状态

3.UrlAuthorizationModule+FileAuthorizationModule:实现了基于URL和文件ACL的授权

除了系统定义的外,还可以自定义HttpModule通Web.config 容易的注册到Web应用中

 

HttpHandler

    不同资源类型的请求,Asp.Net会加载不同的Handle来处理,后缀名不同的文件对应的HttpHandler是不同的,实现了IHttpHandler,方法ProcessRequest提供了处理请求的实现。

HttpHandler 可以配置到Web.config中。例子为svc资源的配置。

<system.web>
    <httpHandlers>
      <add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHander" validate="false" />
    </httpHandlers>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/login.aspx" timeout="2000"></forms>
    </authentication>
  </system.web>

  

MVC

记录一个MVC框架流程和模拟的MVC框架实现。具体代码参考:https://coding.net/u/chenxygx/p/MVCDemo/git

处理请求流程

1. MVC利用路由系统对请求URL进行解析并得到Controller和Action名称以及其他数据。

2. 根据Controller名称反射出其类型,并将其**。

3. 利用Action名称解析出定义在目标Controller类型中对应的方法,然后执行Controller对象的这个方法。

4. Action方法可以在执行过程中直接对当前请求进行相应,也可以返回一个ActionResult对象来相应请求。

5. 如返回ActionResult对象,会执行返回的对象来当作当前请求作最终的相应。

路由

当MVC接受到抵达的请求后,首要任务就是通过当前的HTTP请求的解析得到目标的Controller和Action名称。

MVC中会定义一个全局路由表RouteTable,里面的Route对象对应一个路由模板。路由模板中定义Controller和Action的变量形式。

对于HTTP请求,会遍历路由表RouteTable,找到URL匹配模式,解析核心路由数据 RouteData。

Controller

将得到的RouteData对象包含的目标Controller名称,根据其名称进行**对应的Controller对象

Action

Controller的Execute方法主要作用在于执行目标Action方法。如果返回ActionResult对象,还需要执行该对象来响应。

完整流程

Global 注册路由信息RouteTable,加载Controller工厂ControllerBuilder

当请求到来时

UrlRoutingModule继承自IHttpModule接口进行注册。会利用RouteTable表示路由表针对当前请求实施路由解析。

解析完成后会返回RouteData对象,包含Controller和Action名称。通过RouteData对象的RouteHandler属性得到匹配Route对象采用的RouteHandler对象。