題
怎么樣可以使用更貼近資源(Controller,Action)的方式定義路由。
解決方案
可以使用屬性路由直接在資源級(jí)別聲明路由。只要簡(jiǎn)單的在 Action 上使用屬性路由 RouteAttribute,然后傳一個(gè)相關(guān)路由模板就可以。屬性路由與集中式路由在路由模板含義上基本是一樣的,所有路由參數(shù)應(yīng)該使用花括號(hào),同時(shí)要與使用的 Action 相匹配。直接式路由支持默認(rèn)路由,可選參數(shù),約束。詳細(xì)分析請(qǐng)往下走。
1 [Route("api/teams/{id}")]2 public Team GetTeam(int id)3 {4 //忽略邏輯5 }
要是啟用屬性路由的話,需要在應(yīng)用程序啟動(dòng)的位置,使用 HttpConfiguration 調(diào)用 MapAttributeRoutes 的擴(kuò)展方法。
Config.MapHttpAttributeRoutes();
工作原理
一個(gè)叫做 Attribute Routing 的開源類庫(kù)已經(jīng)成為了 ASP.NET WEB API 2 架構(gòu)的核心部分。隨之而來(lái)的是,解決了集中式路由在維護(hù)上給我們帶來(lái)的痛苦,允許我們直接在 Controller 和 Action 上聲明路由。
對(duì)于大多數(shù)開發(fā)者來(lái)說(shuō),與集中式路由相比,屬性路由(上面所說(shuō)的直接路由)是更加自然的方法,屬性路由強(qiáng)調(diào)的是 WEB API 資源和 URI 之間的直接關(guān)系,URI 資源應(yīng)該是可以通過(guò) HTTP 直接訪問(wèn)。事實(shí)上,還是有一些流行的 .NET Web 框架,例如,ServiceStack、NancyFx 都有自己的方式來(lái)定義這種貼近資源的路由(嵌入資源)。
在應(yīng)用程序啟動(dòng)時(shí),調(diào)用 MapHtpAtrributeRoutes,其實(shí)是告訴 ASP.NET WEB API 掃描所有 Controller 上聲明的屬性路由。
究其緣由,屬性路由的聲明和集中式路由沒有太大的區(qū)別。而且,他們的路由都是被添加到與前面上一篇集中式路由代碼片段 3-1 一樣的路由集合中。最大的不同就是,直接式路由(屬性路由)是作為單一復(fù)合路由(內(nèi)部的 SubRouteCollection 類型)被添加到路由集合中的,使用的路由 key 是 MS_attributerouteWebApi。
處理每個(gè)屬性路由的時(shí)候,Controller(HttpControllerDesc