怎么樣可以使用更貼近資源(Controller,Action)的方式定義路由。

 

解決方案

可以使用屬性路由直接在資源級別聲明路由。只要簡單的在 Action 上使用屬性路由 RouteAttribute,然后傳一個相關(guān)路由模板就可以。屬性路由與集中式路由在路由模板含義上基本是一樣的,所有路由參數(shù)應(yīng)該使用花括號,同時要與使用的 Action 相匹配。直接式路由支持默認(rèn)路由,可選參數(shù),約束。詳細(xì)分析請往下走。

1 [Route("api/teams/{id}")]2 public Team GetTeam(int id)3 {4     //忽略邏輯5 }

 

要是啟用屬性路由的話,需要在應(yīng)用程序啟動的位置,使用 HttpConfiguration 調(diào)用 MapAttributeRoutes 的擴展方法。

Config.MapHttpAttributeRoutes();

 

工作原理

一個叫做 Attribute Routing 的開源類庫已經(jīng)成為了 ASP.NET WEB API 2 架構(gòu)的核心部分。隨之而來的是,解決了集中式路由在維護上給我們帶來的痛苦,允許我們直接在 Controller 和 Action 上聲明路由。

 

對于大多數(shù)開發(fā)者來說,與集中式路由相比,屬性路由(上面所說的直接路由)是更加自然的方法,屬性路由強調(diào)的是 WEB API 資源和 URI 之間的直接關(guān)系,URI 資源應(yīng)該是可以通過 HTTP 直接訪問。事實上,還是有一些流行的 .NET Web 框架,例如,ServiceStack、NancyFx 都有自己的方式來定義這種貼近資源的路由(嵌入資源)。

 

在應(yīng)用程序啟動時,調(diào)用 MapHtpAtrributeRoutes,其實是告訴 ASP.NET WEB API 掃描所有 Controller 上聲明的屬性路由。

 

究其緣由,屬性路由的聲明和集中式路由沒有太大的區(qū)別。而且,他們的路由都是被添加到與前面上一篇集中式路由代碼片段 3-1 一樣的路由集合中。最大的不同就是,直接式路由(屬性路由)是作為單一復(fù)合路由(內(nèi)部的 SubRouteCollection 類型)被添加到路由集合中的,使用的路由 key 是 MS_attributerouteWebApi。

 

處理每個屬性路由的時候,Controller(HttpControllerDesc

網(wǎng)友評論