• MVC中Asp.Net管道(二)


       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对象。

     

     

     

  • 相关阅读:
    linux中上传文件出现Refused to display 'http://***' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.
    1 js中常用的操作
    1 走进并行世界
    18 java I/O 系统
    Spring项目中的数据库加密
    13/14:字符串与类型信息
    使用HttpClient访问接口(Rest接口和普通接口)
    java 队列的使用(转载)
    java锁有哪些类(转)
    J2EE,J2SE,J2ME,JDK,SDK,JRE,JVM区别(转载)
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/5967635.html
Copyright © 2020-2023  润新知