今天复习一下WebAPI的路由知识:

首先分析一下MVC路由和WebAPI路由的区别

在mvc里,默认的路由机制是通过URL路径去匹配控制器和Action方法的,在mvc中的默认路由定义在App_Start文件夹下的RouteConfig.cs文件下:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

在webapi里,默认的路由机制是通过URL路径去匹配控制器,然后通过http的方法去匹配Action的,在WebAPI中的默认路由定义在App_Start文件夹下的WebApiConfig.cs文件下:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "RestFulApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}

WebApi的路由基础:

将MapHttpRoute方法转定义有4个重载的方法:

 //
// 摘要:
// 映射指定的路由模板。
//
// 参数:
// routes:
// 应用程序的路由的集合。
//
// name:
// 要映射的路由的名称。
//
// routeTemplate:
// 路由的路由模板。
//
// 返回结果:
// 对映射路由的引用。
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);
//
// 摘要:
// 映射指定的路由模板并设置默认路由值。
//
// 参数:
// routes:
// 应用程序的路由的集合。
//
// name:
// 要映射的路由的名称。
//
// routeTemplate:
// 路由的路由模板。
//
// defaults:
// 一个包含默认路由值的对象。
//
// 返回结果:
// 对映射路由的引用。
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);
//
// 摘要:
// 映射指定的路由模板并设置默认路由值和约束。
//
// 参数:
// routes:
// 应用程序的路由的集合。
//
// name:
// 要映射的路由的名称。
//
// routeTemplate:
// 路由的路由模板。
//
// defaults:
// 一个包含默认路由值的对象。
//
// constraints:
// 一组表达式,用于指定 routeTemplate 的值。
//
// 返回结果:
// 对映射路由的引用。
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);
//
// 摘要:
// 映射指定的路由模板并设置默认的路由值、约束和终结点消息处理程序。
//
// 参数:
// routes:
// 应用程序的路由的集合。
//
// name:
// 要映射的路由的名称。
//
// routeTemplate:
// 路由的路由模板。
//
// defaults:
// 一个包含默认路由值的对象。
//
// constraints:
// 一组表达式,用于指定 routeTemplate 的值。
//
// handler:
// 请求将被调度到的处理程序。
//
// 返回结果:
// 对映射路由的引用。
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);

看看每个参数的作用:

name:表明路由的名称,注册多个路由时保证不重复就行;

routeTemplate:路由匹配规则。默认是“api/{controller}/{id}”,前面的api是用来区分mvc路由的,不是必选项,是可变的,{controller}是控制器的占位符,{id}是形参的占位符;

defaults:一个包含默认路由值的对象,可以设置controller的默认值;

constraints:对形参的约束;

注册的路由是按照注册先后的顺序进行匹配的,注册越靠前,优先级越大

我们知道,WebApi是符合RESTful风格的,那么如果在一个控制器内部,我们需要提供多个相同的http方法,相同参数的接口我们应该怎么解决呢?

1:活用[Route("")]

在相同请求方法的action的前面可以加上[Route]路由特性进行区分:

/// <summary>
/// 这里可以通过http://localhost:xxxx/api/Values对这个action进行访问
/// </summary>
/// <returns></returns>
public IEnumerable<string> Get1()
{
return new string[] { "value1", "value2" };
}
/// <summary>
/// 这里可以通过http://localhost:xxxx/apis/Values/qqqqq对这个action进行访问
/// </summary>
/// <returns></returns>
[Route("apis/Values/qqqqq")]
public IEnumerable<string> Get2()
{
return new string[] { "value3", "value4" };
}
 和朋友聊了一下,发现这个做法本身就和RESTful风格相抵触,所以就不深究了,一般是对action进行重载,而不是在这上面想办法。

最新文章

  1. 【读书笔记】iOS-给模拟器相册增加图片
  2. C#中==与Equals方法的区别
  3. poj1417 带权并查集+0/1背包
  4. Leetcode Variant-Plus N
  5. Web NFC API
  6. c++之 scanf 接收用户输入内容
  7. 在Ubuntu中使用JAVA与tomcat搭建web服务器
  8. Redis开启远程登录连接。
  9. GItCandy版本库搬迁步骤
  10. 老男孩Python视频教程:第一周
  11. java 文本图片字体模糊优化处理
  12. 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH
  13. (转载)最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件
  14. Kostya Keygen#2分析
  15. Python 解决命令行删除、退格乱码问题
  16. PAT甲 1011. World Cup Betting (20) 2016-09-09 23:06 18人阅读 评论(0) 收藏
  17. Spring Security构建Rest服务-1400-授权
  18. sublime Text快捷键(超级全)
  19. HDU 5974 A Simple Math Problem(数论+结论)
  20. 手脱Aspack变形壳1

热门文章

  1. HTTP之缓存
  2. Facebook币Libra学习-4.新的智能合约语言Move入门
  3. springboot之activemq安装与实践
  4. CSS3常用属性及效果汇总
  5. QPixmap QImage 相互转化
  6. JMeter 不同线程组间变量传递(亲测 ok)
  7. [转]js禁止微信浏览器下拉显示黑底查看网址,不影响内部Scroll
  8. 《精通并发与Netty》学习笔记(06 - Apache Thrift使用简介)
  9. 【Gstreamer开发】用 GStreamer 简化 Linux 多媒体开发
  10. Vue的作用域插槽