今天复习一下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进行重载,而不是在这上面想办法。

C#进阶之WebAPI(三)相关推荐

  1. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...

  2. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...

  3. C#进阶系列——WebApi 接口测试工具:WebApiTestClient

    正文 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗.由于接口个数有点 ...

  4. C#进阶系列——WebApi 异常处理解决方案

    原文:C#进阶系列--WebApi 异常处理解决方案 前言:上篇C#进阶系列--WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理, ...

  5. 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4."怪异"的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4 ...

  6. (转)C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    原文链接:https://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T ...

  7. C#进阶系列——WebApi 跨域问题解决方案:CORS

    C#进阶系列--WebApi 跨域问题解决方案:CORS 参考文章: (1)C#进阶系列--WebApi 跨域问题解决方案:CORS (2)https://www.cnblogs.com/landea ...

  8. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

  9. C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design

    继承与面向对象设计 Inheritance and Object-Oriented Design 面向对象编程已经风靡编程界,关于继承.派生.virtual函数等等需要深入了解. 32.确定你的pub ...

  10. NAS群晖DSM 进阶教程 篇三:DSM 4458 升级 DSM 4493 update7

    WOW唤醒NAS手机APP: Windows Phone 8.1测试可用"Wake my PC"的详细信息  http://www.windowsphone.com/s?app ...

最新文章

  1. CentOS 7安装Zabbix 3.4
  2. h5 video 手机上无法显示_手机镜象投屏到电视上全屏显示
  3. prop在java中_jquery中attr和prop的区别
  4. 学习OpenCV时 ,添加:#includeopencv2/core/core.hpp等头文件出现无法编译的错误
  5. AES加密,解决了同步问题,和随机密钥和固定密钥,多端通信加密不一致解决办法...
  6. k8s-controller manager原理分析
  7. oracle数据库菜鸟入门
  8. 谷歌app使用的是什么字体_如何使用Google字体
  9. Java常见算法(一)
  10. 一文了解新营销,数字经济时代如何以个人为中心重建品牌?
  11. 量子力学在计算机上的应用论文,量子力学论文.doc
  12. mysql一文整理汇总
  13. VSCode常见问题汇总(持续更新中)
  14. php直播表情美颜的实现,如何在直播中实现优质的美颜SDK效果
  15. 程序员必看:一款巨好用的免费简历“神器”(据说有了它,再也不发愁找工作啦!)
  16. 长白山项目开发小组,day1
  17. C# 改变DataGridView标题行的边框颜色
  18. 为什么硬盘插在计算机上不显示,硬盘插在电脑上不显示怎么办
  19. random.seed(seed)、np.random.seed(seed)、torch.manual_seed(seed)作用
  20. c语言数组从小到大冒泡排序,C语言冒泡排序将一个数组按照从小到大进行排序...

热门文章

  1. 计算获取最小值和最大值
  2. JavaSE简单实现多线程聊天
  3. [转载]析构函数的虚析构和非虚析构调用的差别
  4. C#正则表达式开源工具
  5. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
  6. 0421 AutoLayout的实践/基本使用
  7. C# 线程手册 第三章 使用线程 Monitor.TryEnter()
  8. Linq 学习笔记(二)
  9. [dp]Leetcode 5. Longest Palindromic Substring
  10. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]