• 技术文章 >后端开发 >C#.Net教程

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

    Y2JY2J2017-04-25 15:49:22原创1598

    以下为常规MVC路由

     config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
          );

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

    order/Miles/三只松鼠干果/2袋
    order/2017/1/13

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

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

     config.MapHttpAttributeRoutes();

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

     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+"}
          );
        }

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

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

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


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

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

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

    测试结果

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

    测试结果(同一个类下)

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

    测试结果


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

    测试结果

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

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

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

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

    结果

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

    自定义路由约束,需要实现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;
      }
    }

    注册约束

    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参数和默认值

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

    public class BooksController : ApiController
    {
      [Route("api/books/locale/{lcid:int?}")]
      public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
    }

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

    public class BooksController : ApiController
    {
      [Route("api/books/locale/{lcid=1033}")]
      public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }
    }

    以上就是WEB API的 ASP.NET属性路由实例详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:动态生成HTML表单的asp.net方法代码示例 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • C# 动态加载Dll• 从0自学C#04--特性和设计原则• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 【c#教程】C# 属性(Property)• asp.net 图片验证码的HtmlHelper
    1/1

    PHP中文网