详解ASP.NET WEB API 之属性路由

 更新时间:2017年03月27日 17:07:30   作者:三只仓鼠  
本篇文章主要介绍了ASP.NET WEB API 之属性路由,路由就是Web API如何把URI匹配到一个Action的描述。有兴趣的可以了解一下。

以下为常规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) { ... }
}

差不多写这么多常用的,剩余部分自己查看官网!希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • jQuery Data Linking 对象与对象之间属性的关联

    jQuery Data Linking 对象与对象之间属性的关联

    ASP.NET团队最近还向jQuery社区提交了被称为data linking的技术,Data Linking可以帮助你实现对象与对象之间属性的关联——当其中一方发生改变时另一方也随之改变。
    2010-12-12
  • 浅析JSON序列化与反序列化

    浅析JSON序列化与反序列化

    以下是对JSON序列化与反序列化进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • ASP.NET线程相关配置

    ASP.NET线程相关配置

    ASP.NET 同一时刻只能发起的工作线程数量
    2012-12-12
  • asp.net 实现下拉框只读功能

    asp.net 实现下拉框只读功能

    下拉框只读此功能并不是默认的,需要手动操作下,本文介绍javascript与asp.net实现下拉框只读功能,需要了解的朋友可以参考一下
    2012-12-12
  • .NET 水晶报表使用代码

    .NET 水晶报表使用代码

    下面就是介绍在.net下,如何使用水晶报表的方法。
    2009-04-04
  • .Net Core基于ImageSharp实现图片缩放与裁剪

    .Net Core基于ImageSharp实现图片缩放与裁剪

    这篇文章介绍了.Net Core基于ImageSharp实现图片缩放与裁剪的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • .NET实现API版本控制

    .NET实现API版本控制

    这篇文章介绍了.NET实现API版本控制的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    这篇文章主要给大家介绍了关于ASP.NET WebAPI2复杂请求跨域设置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用ASP.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • ASP.NET Cookie是怎么生成的(推荐)

    ASP.NET Cookie是怎么生成的(推荐)

    这篇文章主要介绍了ASP.NET Cookie是怎么生成的,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    这篇文章主要介绍了详解ASP.NET Core 2.0 路由引擎之网址生成(译),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论