您好,登录后才能下订单哦!
这篇文章给大家分享的是有关WEB API中ASP.NET属性路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
以下为常规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属性路由的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。