ASP.NET MVC 專案啟動時在 Application_Start 註冊路由規則:
protected void Application_Start() {
RegisterRoutes(RouteTable.Routes);
}
隨著規則增多,URL 與 Controller/Action 的對應關係難以直觀掌握。RouteMonitor.dll 提供一個視覺化頁面,輸入任意 URL 即可即時顯示匹配結果、路由資料、所有已註冊路由的匹配狀態。
protected void Application_Start() {
RegisterRoutes(RouteTable.Routes);
RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); // 關鍵一行
}

IRouteHandler,轉交給 DebugHttpHandlerIHttpHandler,產出偵錯頁面 HTMLpublic static void RewriteRoutesForTesting(RouteCollection routes) {
using (routes.GetReadLock()) { // 多執行緒安全讀取鎖
bool hasDebugRoute = false;
foreach (RouteBase baseRoute in routes) {
Route route = baseRoute as Route;
if (route != null) {
// 將所有現有路由的 Handler 替換為 DebugRouteHandler
route.RouteHandler = new DebugRouteHandler();
}
if (route == DebugRoute.Singleton) hasDebugRoute = true;
}
// 確保 DebugRoute 位於集合末尾(捕獲所有落網之魚)
if (!hasDebugRoute) routes.Add(DebugRoute.Singleton);
}
}
routes.GetReadLock() 使用 ReaderWriterLock 實現多執行緒同步,讀取時允許並發,寫入時獨佔。RouteHandler 使所有路由最終都交由 DebugHttpHandler 處理。DebugRoute 以 {*catchall} 模式匹配任意 URL,確保無匹配時也能進入偵錯頁面。public class DebugRouteHandler : IRouteHandler {
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
var handler = new DebugHttpHandler();
handler.RequestContext = requestContext;
return handler;
}
}
將 RequestContext 傳遞給 Handler,保留完整路由上下文。
RequestContext.RouteData 包含 Values (URL 參數)、DataTokens、Route 物件。RouteBase.GetRouteData() 判斷每條路由是否匹配當前請求。RouteData.Route is DebugRoute → 顯示 NO MATCH!。// 核心片段
foreach (RouteBase baseRoute in RouteTable.Routes) {
bool matched = baseRoute.GetRouteData(RequestContext.HttpContext) != null;
string statusHtml = $"{matched}";
// ... 格式化各屬性 ...
allRoutesHtml += $"{statusHtml} {url} {defaults} {constraints} {dataTokens} ";
}
// 最後 Response.Write 完整 HTML
private static string FormatRouteValueDictionary(RouteValueDictionary dict) {
if (dict == null) return "(null)";
var sb = new StringBuilder();
foreach (var key in dict.Keys) {
sb.AppendFormat("{0} = {1}, ", key, dict[key]);
}
if (sb.Length > 2) sb.Length -= 2; // 移除尾隨逗號
return sb.ToString();
}
| 區塊 | 說明 |
|---|---|
| Route Data | 當前請求匹配路由的參數鍵值對 (controller, action, id 等) |
| Data Tokens | 路由附加資料 (命名空間、自定義 Token 等) |
| All Routes | 所有已註冊路由的匹配狀態、URL 模式、Defaults、Constraints、DataTokens |
| AppRelativeCurrentExecutionFilePath | 原始請求相對路徑 |

app.UseRouting() + app.UseEndpoints(),可用 dotnet-route 工具或中介軟體列印路由表。理解 RouteMonitor 內部機制,有助於掌握 ASP.NET Routing 管線運作,並能自行擴展客製化偵錯工具。