天天看點

使用ASP.NET Web Api建構基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

題外話:由于這個技術點是新學的,并不屬于原系列,但借助了原系列的項目背景,故命名外傳系列,以後也可能在這個系列中附加一些新的技術。

前言

在Web Api 2.0中,提出了一種新的配置路由方式——基于特性的路由(Attribute-based Routing),在我們之前介紹的配置路由方式稱為——基于公約的路由(Convention-based Routing),新的路由配置方式同樣應用在MVC5中,是以本文就來介紹一下基于特性的路由。

在之前的一篇文章中,我們處理了這麼一個業務——實作學生選課。我們是通過在“WebApiConfig”定制了一條路由資料來實作的,這條路由實作了選課以及根據課程Id來查詢選擇選擇該課程的所有學生資訊,感覺設計還可以。在實際應用中一般來說查詢用的是最多的,使用Attribute Routing來注冊路由會更靈活,控制起來也更友善,更符合Rest。本文以根據課程的名字來查詢所有選擇該課程的學生資訊以及根據課程名字以及學生名字查詢某一學生的資訊。

基于特性的路由介紹

顧名思義,新路由将使用一個特性來實作路由注冊,如下:

這個類包含3個屬性:Name指路由的名字,Order是指路由的順序,Template就是我們要去比對URL的模闆

實作Attribute Routing

原理性的東西不多介紹的(我也沒多研究 呵呵),能把學到的技術運用到實際中才是王道,上來一大堆原理容易暈,以後需要深入研究再看原理。

在“EnrollmentsController”中新增一個方法GetStudentsInfo:

在我們的Action上使用了RouteAttribute。分析一下這個URL模闆("api/enrollments/{courseName}/{studentName?}"),{courseName}會比對到Action的courseName參數上,對于Action的另一個參數studentName是一個可選參數,也就是說請求中沒有給出值那麼就是預設的空字元串,有值得話就會被指派,是以我們在“{studentName}”後面加上? 标記為可選的URI參數。

ok,就這麼簡單,測試一次:

使用ASP.NET Web Api建構基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

結果:

使用ASP.NET Web Api建構基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

呃,出錯了。。。

一個新的問題

出錯了,不過不管怎麼說解決方案總歸是有的,首先看下錯誤原因:是在LearningControllerSelector類的方法中出現了空引用,那麼我們就不得不看下這個方法:

在“var controllerName = routeData.Values["controller"].ToString(); ”代碼之前加一個判斷:

再次請求就會得到如下結果:

使用ASP.NET Web Api建構基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

結果正确,解決方案感覺還可以再考慮考慮,大家有什麼好的建議可以提。但是不管怎麼說,有一點是明确的:對于基于特性的路由規則,不需要包含Controller的名字,在本案列中感覺上是尋找Acton上的路由模闆來比對請求的URI,然後确定對應的Action。

總結

基于特性路由(Attribute Routing)是一種新的定制路由規則方式,與傳統的配置方式相比更靈活,但同時比較分散,在web api中,2鐘路由配置方式可以共存,是以本文隻是介紹一種新的配置方式,做項目時也可以多一種選擇。

繼續閱讀