今天開始學習ASP.NET MVC,在看《ASP.NET MVC架構與實戰》時,看到有這樣一個組件 RouteMonitor.dll,覺得挺實用的,可以用來檢測Url路徑的映射匹配情況,只要在浏覽器中輸入請求地址,就可以得到匹配的情況,並且以一種友好的頁面展現給我們,如下圖所示:
圖一
於是乎,決定先自己分析一下該原理。
1. 我們都知道一個應用程序啟動是從Application_Start事件開始的,在創建一個新的ASP.NET MVC應用程序的時候,默認會在該事件中添加
RegisterRoutes(RouteTable.Routes);
接著RegisterRoutes方法裡面編寫一些路由映射的方法,將請求的URL映射到相應的控制器中。
2. 現在將Application_Start事件中改寫成這樣的代碼:
1 protected void Application_Start()
2 {
3 RegisterRoutes(RouteTable.Routes);
4 RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
5 }
注意到第3行的代碼,引用的就是RouteMonitor.dll的組件,通過RouteDebugger的靜態方法RewriteRoutesForTesting,並且賦予一個RouteCollection的路由集合的參數,將頁面映射到圖一的頁面,便於查看路由映射的情況。
3. 現在開始分析下RouteMonitor.dll裡面都有些什麼呢。
裡面包含DebugHttpHandler類,DebugRoute類,DebugRouteHandler類,RouteDebugger類,我們先看看RouteDebugger類都做了些什麼:
1 public static class RouteDebugger
2 {
3 public static void RewriteRoutesForTesting(RouteCollection routes)
4 {
5 //可對路由集合類進行多線程同步訪問
6 using (routes.GetReadLock())
7 {
8 bool flag = false;
9 foreach (RouteBase base2 in routes)
10 {
11 Route route = base2 as Route;
12 if (route != null)
13 {
14 route.RouteHandler = new DebugRouteHandler();
15 }
16 if (route == DebugRoute.Singleton)
17 {
18 flag = true;
19 }
20 }
21