詳解ASP.NET WEB API 之屬性路由
以下為常規(guī)MVC路由
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, );
如果我們要實(shí)現(xiàn)類似以下效果路由的話,使用常規(guī)公約路由比較麻煩。
order/Miles/三只松鼠干果/2袋 order/2017/1/13
如果使用屬性路由的話就比較簡單了。
新建WEB API項(xiàng)目的話,打開App_Start目錄下的WebApiConfig.cs文件添加以下代碼開啟屬性路由配置。
config.MapHttpAttributeRoutes();
屬性路由也可以和公約路由混合使用,如下:
public static void Register(HttpConfiguration config) { // Web API 配置和服務(wù) // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id=@"\d+"} ); }
在要使用屬性路由的方法上打上特性標(biāo)記,如下 :
[Route("order/{UserNickName}/{ProductName}/{count}")]
測試結(jié)果(URL經(jīng)過了編碼,不然會(huì)報(bào)400錯(cuò)誤。)
通常情況下,在同一個(gè)控制器中的所有路由以相同的前綴開頭
[Route("api/books")] [Route("api/books/{id:int}")] [Route("api/books")]
這樣很明顯是比較麻煩的。所以我們用[RoutePrefix]屬性來設(shè)置一個(gè)公共的前綴
測試結(jié)果
如果使用了[RoutePrefix]的話,某些比較特殊的api,我們可以使用波浪線來重寫路由前綴,如下:
測試結(jié)果(同一個(gè)類下)
路由前綴中也可以包含參數(shù),如下
測試結(jié)果
可以在路由中添加參數(shù)約束,如下
測試結(jié)果
如果參數(shù)不是Int類型,則不會(huì)匹配到該路由
以下都是一些會(huì)被支持到的約束
可以使用多個(gè)約束,但是要用冒號(hào)分開
[Route("users/{id:int:length(1,3)}")] public User GetUserById(int id) { ... }
結(jié)果
如果不在范圍內(nèi)的話則匹配不到
自定義路由約束,需要實(shí)現(xiàn)IHttpRouteConstraint接口,具體查看官方
public class NonZeroConstraint : IHttpRouteConstraint { public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { object value; if (values.TryGetValue(parameterName, out value) && value != null) { long longValue; if (value is long) { longValue = (long)value; return longValue != 0; } string valueString = Convert.ToString(value, CultureInfo.InvariantCulture); if (Int64.TryParse(valueString, NumberStyles.Integer, CultureInfo.InvariantCulture, out longValue)) { return longValue != 0; } } return false; } }
注冊(cè)約束
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint)); config.MapHttpAttributeRoutes(constraintResolver); } }
使用約束
[Route("{id:nonzero}")] public HttpResponseMessage GetNonZero(int id) { ... }
可選的URI參數(shù)和默認(rèn)值
你可以通過添加一個(gè)問號(hào)標(biāo)記路由參數(shù)使成為一個(gè)可選的URI參數(shù)。如果一個(gè)路由參數(shù)是可選的,你必須為這個(gè)方法參數(shù)定義一個(gè)默認(rèn)值。
public class BooksController : ApiController { [Route("api/books/locale/{lcid:int?}")] public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... } }
或者在路由模版中定義默認(rèn)值
public class BooksController : ApiController { [Route("api/books/locale/{lcid=1033}")] public IEnumerable<Book> GetBooksByLocale(int lcid) { ... } }
差不多寫這么多常用的,剩余部分自己查看官網(wǎng)!希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET?Core?MVC路由(Routing)的用法
- ASP.NET Core中的Razor頁面實(shí)現(xiàn)路由功能
- ASP.NET?Core使用功能開關(guān)控制路由訪問操作(續(xù))
- ASP.NET?Core使用功能開關(guān)控制路由訪問操作
- Asp.net Core 如何設(shè)置黑白名單(路由限制)
- 詳解ASP.NET Core端點(diǎn)路由的作用原理
- ASP.NET Core中自定義路由約束的實(shí)現(xiàn)
- asp.net core webapi項(xiàng)目配置全局路由的方法示例
- asp.net core 屬性路由和約定路由的實(shí)現(xiàn)
相關(guān)文章
Entity?Framework生成DataBase?First模式
本文詳細(xì)講解了Entity?Framework生成DataBase?First模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03asp.net下XML的加密和解密實(shí)現(xiàn)方法
xml加密(XML Encryption)是w3c加密xml的標(biāo)準(zhǔn)。這個(gè)加密過程包括加密xml文檔的元素及其子元素,通過加密,xml的初始內(nèi)容將被替換,但其xml格式仍然被完好的保留。2010-02-02此頁的狀態(tài)信息無效,可能已損壞 的處理辦法及原因分析
此頁的狀態(tài)信息無效,可能已損壞 的處理辦法及原因分析,需要的朋友可以參考一下2013-06-06ASP.NET中HTML頁面的訪問驗(yàn)證設(shè)置方法
這篇文章主要介紹了ASP.NET中HTML頁面的訪問驗(yàn)證設(shè)置方法,需要的朋友可以參考下2015-10-10asp.net中Null在從數(shù)據(jù)庫讀取的時(shí)候的一點(diǎn)點(diǎn)小技巧
我們先看下面的一段代碼,這段代碼其實(shí)很平常,也是我們平時(shí)做項(xiàng)目很常用的一段2012-04-04