我试图在较低的层次上理解 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)
从这里开始,这只是路由匹配的问题,然后导致使用 MvcRouteHandler 调用 MvcHandler 并启动整个事件链。所以我最初的假设是 MvcRouteHandler 在某处的配置中注册是错误的。相反,它是通过 global.asax.cs 文件中 Application_Start 事件中的代码开始配置的。
它是否正确?