ASP.NET MVC 请求流程

一、应用程序启动

1.Application_Start方法,程序启动

image_thumb8

2.RegisterRoutes方法,注册路由

image_thumb9

3.System.Web.Mvc.RouteCollectionExtensions.MapRoute方法,出现了MvcRoutehandler对象

image_thumb111

二、请求进入

在 “$\Windows\Microsoft.NET\Framework\版本号\Config\Web.config“ 中可以找到 " <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />”

证明请求会经过System.Web.Routing.UrlRoutingModule.Init方法。

1.System.Web.Routing.UrlRoutingModule.Init方法

image_thumb

2.System.Web.Routing.UrlRoutingModule.PostResolveRequestCache方法

3.System.Web.Routing.RouteCollection.GetRouteData方法

4.System.Web.Routing.Route.GetRouteDara方法

这里的this.RouteHandler就是在第一部分中应用程序启动是实例化好的MvcRouteHandler对象。好了,我们现在已经得到了MvcRouteHandler实例,继续向下走,先返回第2步:

2.System.Web.Routing.UrlRoutingModule.PostResolveRequestCache方法

image_thumb12

3. System.Web.Mvc.MvcRouteHandler.GetHttpHandler方法,返回MvcHandler对象

image_thumb15

4.System.Web.Mvc.MvcHandler的构成方法

image_thumb17

发现这个类实现了IHttpHandler接口,那么不得不去看下ProcessRequest方法

5.System.Web.Mvc.MvcHandler.ProcessRequest方法

image_thumb30

6.System.Web.Mvc.MvcHandler.ProcessRequestInit方法

image_thumb31

返回到第5步

5.System.Web.Mvc.MvcHandler.ProcessRequest方法

image_thumb32

6.System.Web.Mvc.ControllerBase.Excete方法

image_thumb26

7.System.Web.Mvc.Controller.ExcuteCore方法

image_thumb33

8.System.Web.Mvc.Controller.ActionInvoker属性

image_thumb29

9.System.Web.Mvc.Controller.CreateActionInvoker方法

image_thumb28

返回了实现IActionInvoker接口的实例,返回第7步

7.System.Web.Mvc.Controller.ExcuteCore方法

image_thumb27

8.System.Web.Mvc.ControllerActionInvoker.InvokeAction方法

image_thumb7

9.System.Web.Mvc.ControllerActionInvoker.InvokeActionResult方法

image_thumb91

10.System.Web.Mvc.ActionResult类,封装一个操作方法的结果

image_thumb10

我们来看一下重写了ExcuteResult的ActionResult的派生类:

image_thumb11

我们就选ViewResultBase类中的ExcuteResult方法看看

11.System.Web.Mvc.ViewResultBase.ExcuteResult方法

image_thumb13

12.System.Web.Mvc.ViewResult.ExcuteResult方法

image_thumb21

13.System.Web.Mvc.ViewEngineCollection.FindView方法

image_thumb22

14.System.Web.Mvc.VirtualPathProviderViewEngine.FindView方法

image_thumb23

返回第13步

13.System.Web.Mvc.ViewEngineCollection.FindView方法

image_thumb24

14.System.Web.Mvc.ViewEngineCollection.Find方法

image_thumb18

15.System.Web.Mvc.ViewEngineCollection.Find方法

image_thumb19

至此,我们得到了ViewEngineResult对象,ViewEngineResult表示定位视图引擎的结果。

现在我们返回第11步,继续向下走

11.System.Web.Mvc.ViewResultBase.ExcuteResult方法

image_thumb20

12.System.Web.Mvc.BuildManagerCompiledView.Render方法

image_thumb34

13. System.Web.Mvc.RazorView.RenderView方法,在这里使用Razor视图引擎来展示页面

image_thumb35

posted @   烧点饭  阅读(4887)  评论(4编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2013-11-19 设计模式之建造者模式(七)
点击右上角即可分享
微信分享提示