zoukankan      html  css  js  c++  java
  • 一张大图看懂Mvc启动过程

    链接地址 https://www.processon.com/view/link/59e71fbbe4b09000f03ce78e

    总结:

    1. 在Global.ascx 中我们使用RouteCollection中使用MapRoute注册了自己的RouteData,这里面就引入了IRouteHandler,也就是MvcRouteHandler

    2. 在UrlRoutingModule中获取了第一步中设置的IRouteHandler(MvcRouteHandler)并获取了IHttpHandler(MvcHandler),然后使用HttpContextBase.RemapHandler() 注入了MvcHandler,然后继续管道事件的执行

    3. 在MvcHandler中激活了IController.Execute()

    4. ControllerBase 中对Execute进行了封装并开放了ExecuteCore方法,Controller重写ExecuteCore方法,并激活了Action的执行

    5. 插一句: 激活Controller的原理大概是,RouteData.GetRequiredString()获取controllername,然后利用反射找到具体的类实例化并调用ExecuteCore方法,

        激活Action的原理是RouteData.GetRequiredString()获取actionname,之前找到的Controller利用反射找到对应方法,然后执行

    6. action 执行过程中,会触发ActionResult.ExecuteResult()  ,普通的返回值比如Json(),File(),Content()这些比较简单,只是使用Response.Write() 配合Content-Type完成输出而已,所以图中忽略了

        真正难得ViewResult,他需要加载Razor语法和数据,这个是比较复杂的

    7. ViewResultBase继承自ViewResult,封装了参数检查,和渲染页面的操作,同时开发了一个FindView() 方法

        在ExecuteResult中我们可以看到他找到IView之后,调用了IView.Render()完成了对Response.OutPut的修改,最终完成渲染

    8. PartialViewResult 和ViewResult 都要事先FindView,而他们又是通过调用ViewEngineCollection来完成这个操作的

        ViewEngineCollection其实又是对IViewEngine的一个封装,其中的Engines属性默认只有系统默认实现的两个类 RazorViewEngine,WebFormViewEngine

        这里我也无法深入解析了,还不太懂,就这样吧

    9. 完成了IView.Render() 之后基本上razor页面就已经在Response中了,然后按照asp.net的管道事件一直到End_Request ,然后再到浏览器接收整个报文,game over.

    这就是
  • 相关阅读:
    搭建JUnit环境
    搭建日志环境并配置显示DDL语句
    先建表还是先建实体类
    hbm2ddl
    总结与提纲
    常见O/R框架介绍
    hibernate 模拟实现和What is and Why O/R Mapping
    hibernate 注解不给提示
    额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~
    导入android工程@Override报错
  • 原文地址:https://www.cnblogs.com/zhangrCsharp/p/7688592.html
Copyright © 2011-2022 走看看