1. 程式人生 > >ASP.NET Core 中文文件 第三章 原理(4)路由

ASP.NET Core 中文文件 第三章 原理(4)路由

路由是用來把請求對映到路由處理程式。應用程式一啟動就配置了路由,並且可以從URL中提取值用於處理請求。它還負責使用 ASP.NET 應用程式中定義的路由來生成連結。

這份文件涵蓋了初級的ASP.NET核心路由。對於 ASP.NET 核心 MVC 路由, 請檢視 Routing to Controller Actions

章節:

路由基礎

路由使用 routes 類 ( IRouter 的實現) 做到:

  • 對映傳入的請求到 路由處理程式
  • 生成響應中使用的 URLs

一般來說,一個應用會有單個路由集合。這個集合會按順序處理。請求會在這個路由集合裡按照 URL matching 來查詢匹配。響應使用路由生成 URLs。

URL 匹配

路由匹配指的是路由排程請求到一個處理程式的過程。這個過程通常是基於URL路徑中的資料,但可以擴充套件到請求中的任何資料。排程請求到不同處理程式的能力是應用調節自身大小和複雜度的關鍵。

請求呼叫序列中每個路由的非同步方法來進入路由中介軟體IRouter 例項通過設定 RouteContext Handler 為一個不為空的 RequestDelegate 來選擇是否處理請求。如果一個處理程式已經設定了路由,那麼它就將被呼叫來處理這個請求,並且不會有其他的路由再去處理。如果所有的路由都執行了,請求還沒有找到處理程式,那麼中介軟體就會呼叫next方法,從而下一個在請求管道中的中介軟體就被呼叫了。

RouteAsync 執行期間,一個成功匹配會基於已經完成的請求處理設定 RouteContext.RouteData 的屬性為合適的值。當一個路由成功匹配了一個請求時,RouteContext.RouteData 包含了重要的關於匹配結果的狀態資訊。

RouteData Values 是一個從路由產生的 路由值 字典。這些值通常由標記化的 URL 確定的,可以用來接收使用者輸入,或者用來在應用內部做更深層的排程決定。

RouteData DataTokens 是相關的匹配路由附加資料的屬性包。提供 資料令牌 支援與每個路由相關的狀態資料,這樣應用基於匹配的路由可以遲點做出決定。這些資料是開發人員定義的,不會式影響路由的行為。而且,資料令牌中的值可以是任何型別,對比路由值,它可以很容易的轉成字串。

RouteData Routers 是一個成功匹配請求的路由列表。路由可以彼此巢狀,而且 Routers 屬性反映了請求通過路由邏輯樹導致匹配的路徑。一般來說, Routers 中的第一項就是一個路由集合,而且應該用來生成URL。 Routers 中的最後一項就是已匹配路由。

URL 生成

URL 生成是指的路由基於一系列的路由值建立一個URL路徑的過程。這允許你的處理程式和能訪問它們的URL直接有一個邏輯分離。

路由生成遵循一個類似的迭代過程,但開始於使用者或框架程式碼呼叫到路由集合的 GetVirtualPath 方法時。每個路由的 GetVirtualPath 方法都會被呼叫,直到返回一個不為空的 VirtualPathData

GetVirtualPath 的主要輸入是:

路由主要使用 ValuesAmbientValues 提供的路由值來決定在哪兒生成一個 URL 以及包含什麼值。 AmbientValues 是隨著路由系統匹配當前請求而產生的一系列路由值。 相反,Values 是用於指定如何生成當前操作所需的URL的路由值。提供 HttpContext 是以防路由需要獲取服務或當前上下文相關的資料。

建議
Values 看做是對 AmbientValues 的過載。URL生成嘗試重用來自當前請求的路由值,以便使用相同路由或路由值的連結更容易生成 URL。

GetVirtualPath 的輸出是一個 VirtualPathDataVirtualPathData是一個並行的 RouteData ;它包含了輸出 URL 的虛擬路徑以及應該由路由設定的一些額外的屬性。

VirtualPathData VirtualPath 屬性包含了路由生成的虛擬路徑。根據你的需求,可能需要進一步處理的。例如,如果你想在 HTML 中呈現生成的 URL,你需要預先設定好應用的基礎路徑。

VirtualPathData DataTokens 屬性是一個關聯到生成URL的路由的附加資料的字典集合,這個和 RouteData.DataTokens 是並行的。

建立路由

路由提供了 Route 類作為 IRouter 的標準實現。當呼叫 RouteAsync 方法時, Route 使用 路由模板 語法定義匹配URL路徑的模式。當呼叫 GetVirtualPath 方法時,Route會使用相同的路由模板生成 URL。

大多數的應用會通過呼叫 MapRoute 方法或者定義在 IRouteBuilder 介面上的一個類似的擴充套件方法來建立路由。所有的這些方法會建立一個 Route 例項並新增到路由集合中。

注意
MapRoute 不需要路由處理引數--它只新增將被 DefaultHandler 處理的路由。由於預設處理程式是一個 IRouter 物件,可能決定不去處理請求。MVC通常配置了一個預設處理程式,它只處理能匹配到可用的控制器和操作的請求。瞭解更多關於MVC的路由,請點選