路由系統是請求訊息進入ASP.NET Web API訊息處理管道的第一道屏障,其根本目的是利用註冊的路由表(RouteTable)對請求的URI進行解析以確定目標HttpController和Action的名稱,以及與目標Action方法某個引數進行繫結的路由變數。
ASP.NET Web API框架是一個獨立於傳輸層的抽象訊息處理管道,其本身並不具有傳輸協議的偵聽、接收和響應能力。
WebHost和SelfHost這兩種典型的寄宿模式採用兩種截然不同的機制實現了ASP.NET Web API路由系統的適配。
ASP.NET Web API 包含路由系統在內的核心框架是一個獨立於寄宿環境的訊息處理管道,這是為什麼它能支援多種不同寄宿模式的根源所在。服務寄宿的目的在於提供一個執行環境以監聽並接收來自外界的請求,並將請求適當加工後遞交給這個抽象的訊息處理管道進行處理,最後將管道處理後生成的響應利用網路傳輸返回給客戶端。對於WebHost來說,真正的路由功能是由ASP.NET自身的路由系統來完成的。ASP.NET MVC的路由完全是由ASP.NET路由系統來完成的,但後者並非專門為MVC而設計,其實它最初是為了幫助Web Forms應用實現“請求地址與物理檔案的分離”而設計的。
一個簡單的例子來註冊ASP.NET路由對映
這個Route的註冊包括了:對映URI各段(Segment)的預設值,值的約束以及其它一些附加資料。
1 using System; 2 using System.Web; 3 using System.Web.Routing; 4 5 namespace WebHost 6 { 7 public class Global : HttpApplication 8 { 9 protected void Application_Start(object sender, EventArgs e) 10 { 11 // 設定路由對映URI各段的預設值 12 var defaults = new RouteValueDictionary 13 { 14 {"areacode", "010"} 15 }; 16 17 // 設定值的約束 18 var constrains = new RouteValueDictionary 19 { 20 {"areacode", @"0\d{2,3}"}, 21 {"days", @"[1-3]"} 22 }; 23 24 // 設定附加資料 25 var dataTokens = new RouteValueDictionary 26 { 27 {"defaultCity", "BeiJing"}, 28 {"defaultDays", "2"} 29 }; 30 31 // 在路由表中註冊路由(Friendly URL與物理檔案分離) 32 RouteTable.Routes.MapPageRoute("default", "{areacode}/{days}", "~/weather.aspx", false, defaults, constrains, dataTokens); 33 } 34 } 35 }
寫一個WebForm頁面來呈現上述的各種路由資料
1 using System; 2 using System.Web.UI; 3 4 namespace WebHost 5 { 6 public partial class Weather : Page 7 { 8 protected void Page_Load(object sender, EventArgs e) 9 { 10 if (!IsPostBack) 11 { 12 if (RouteData.Route != null) 13 { 14 Response.Write(RouteData.Route.GetType().FullName); 15 Response.Write("<br/>"); 16 } 17 if (RouteData.RouteHandler != null) 18 { 19 Response.Write(RouteData.RouteHandler.GetType().FullName); 20 Response.Write("<br/>"); 21 } 22 Response.Write("<b>RouteData Values:</b></br>"); 23 foreach (var variable in RouteData.Values) 24 { 25 Response.Write($"<li>{variable.Key}={variable.Value}</li>"); 26 } 27 Response.Write("<b>RouteData DataTokens:</b>"); 28 foreach (var variable in RouteData.DataTokens) 29 { 30 Response.Write($"<li>{variable.Key} = {variable.Value}</li>"); 31 } 32 } 33 } 34 } 35 }
執行結果