WEB API的 ASP.NET属性路由实例详解


本文摘自PHP中文网,作者Y2J,侵删。

以下为常规MVC路由

1

2

3

4

5

config.Routes.MapHttpRoute(

       name: "DefaultApi",

       routeTemplate: "api/{controller}/{id}",

       defaults: new { id = RouteParameter.Optional },

     );

如果我们要实现类似以下效果路由的话,使用常规公约路由比较麻烦。

1

2

order/Miles/三只松鼠干果/2袋

order/2017/1/13

如果使用属性路由的话就比较简单了。

新建WEB API项目的话,打开App_Start目录下的WebApiConfig.cs文件添加以下代码开启属性路由配置。

1

config.MapHttpAttributeRoutes();

属性路由也可以和公约路由混合使用,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public static void Register(HttpConfiguration config)

   {

     // Web API 配置和服务

 

     // Web API 路由

     config.MapHttpAttributeRoutes();

 

     config.Routes.MapHttpRoute(

       name: "DefaultApi",

       routeTemplate: "api/{controller}/{id}",

       defaults: new { id = RouteParameter.Optional },

       constraints: new { id=@"\d+"}

     );

   }

在要使用属性路由的方法上打上特性标记,如下 :

1

[Route("order/{UserNickName}/{ProductName}/{count}")]

测试结果(URL经过了编码,不然会报400错误。)


通常情况下,在同一个控制器中的所有路由以相同的前缀开头

1

2

3

[Route("api/books")]

[Route("api/books/{id:int}")]

[Route("api/books")]

这样很明显是比较麻烦的。所以我们用[RoutePrefix]属性来设置一个公共的前缀

测试结果

如果使用了[RoutePrefix]的话,某些比较特殊的api,我们可以使用波浪线来重写路由前缀,如下:

测试结果(同一个类下)

路由前缀中也可以包含参数,如下

测试结果


可以在路由中添加参数约束,如下

测试结果

如果参数不是Int类型,则不会匹配到该路由

以下都是一些会被支持到的约束

可以使用多个约束,但是要用冒号分开

1

2

[Route("users/{id:int:length(1,3)}")]

public User GetUserById(int id) { ... }

结果

如果不在范围内的话则匹配不到

自定义路由约束,需要实现IHttpRouteConstraint接口,具体查看官方

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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;

  }

}

注册约束

1

2

3

4

5

6

7

8

9

10

public static class WebApiConfig

{

  public static void Register(HttpConfiguration config)

  {

    var constraintResolver = new DefaultInlineConstraintResolver();

    constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));

 

    config.MapHttpAttributeRoutes(constraintResolver);

  }

}

使用约束

1

2

[Route("{id:nonzero}")]

public HttpResponseMessage GetNonZero(int id) { ... }

可选的URI参数和默认值

你可以通过添加一个问号标记路由参数使成为一个可选的URI参数。如果一个路由参数是可选的,你必须为这个方法参数定义一个默认值。

1

2

3

4

5

public class BooksController : ApiController

{

  [Route("api/books/locale/{lcid:int?}")]

  public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }

}

或者在路由模版中定义默认值

1

2

3

4

5

public class BooksController : ApiController

{

  [Route("api/books/locale/{lcid=1033}")]

  public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }

}

以上就是WEB API的 ASP.NET属性路由实例详解的详细内容!

相关阅读 >>

asp.net+jquery如何实现省市二级联动功能的方法详解

理解asp.net中Webform的生命周期_实用技巧

asp.net mvc 遇到json循环调用的问题应该怎么解决?

详细介绍《asp.net》数据绑定――gridview

asp.net中md5加密码的代码详解

asp.net core应用中与第三方ioc/di框架的整合

asp.net中healthmonitor属性的用法教程

关于asp.net如何利用ajaxpro完成前端跟后台交互的实例分析

asp.net core实例详解四(project.json文件)

分享asp.net学习笔记(9)Webpages图表

更多相关阅读请进入《Web》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...