4

我试图在较低的层次上理解 ASP.Net MVC。具体来说,我试图了解 MVC 运行时是如何启动的。对于我对调用堆栈/反编译的初步挖掘,它似乎是由 MvcRouteHandler 启动的,然后构造 MvcHandler。但是,我似乎找不到 MvcRouteHandler 的注册位置。这个 RouteHandler 如何被添加到 ASP.Net 管道中?

更新
经过进一步检查,我已经将MvcRouteHandler构造追踪到RouteCollectionExtensions看起来包含该类扩展的RouteCollection类中。包含构造函数的具体方法有如下定义:

public static Route MapRoute(this RouteCollection routes, 
                             string name, 
                             string url, 
                             object defaults, 
                             object constraints, 
                             string[] namespaces)

我相信在这行代码中找到了关键:

Route route = new Route(url, new MvcRouteHandler());

所以,对我来说,这是分配 MvcRouteHandler 的地方。整个事件链如下所示:

一切始于Global.asax.cs

Application_Start()
RouteConfig.RegisterRoutes
RouteCollectionExtensions.MapRoute(this RouteCollection routes, string name, string url, object defaults)
RouteCollectionExtensions.MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints)
RouteCollectionExtensions.MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)

从这里开始,这只是路由匹配的问题,然后导致使用 M​​vcRouteHandler 调用 MvcHandler 并启动整个事件链。所以我最初的假设是 MvcRouteHandler 在某处的配置中注册是错误的。相反,它是通过 global.asax.cs 文件中 Application_Start 事件中的代码开始配置的。

它是否正确?

4

1 回答 1

5

该请求通过 ASP.net 管道,然后被UrlRoutingModuleHTTP 模块捕获。

更多信息:ASP.NET MVC 是如何工作的?

编辑:路由模块安装在您的计算机 web.config 中,您的站点 web.config 继承该模块。你可以在%systemroot%\Microsoft.NET\Framework\$versionNumber$\CONFIG\Web.config

在此处输入图像描述

于 2012-10-24T22:54:26.663 回答