C#进阶之WebAPI(三)
今天复习一下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(三)相关推荐
- C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...
- C#进阶系列——WebApi 接口参数不再困惑:传参详解
看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...
- C#进阶系列——WebApi 接口测试工具:WebApiTestClient
正文 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗.由于接口个数有点 ...
- C#进阶系列——WebApi 异常处理解决方案
原文:C#进阶系列--WebApi 异常处理解决方案 前言:上篇C#进阶系列--WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理, ...
- 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解
阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4."怪异"的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4 ...
- (转)C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
原文链接:https://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T ...
- C#进阶系列——WebApi 跨域问题解决方案:CORS
C#进阶系列--WebApi 跨域问题解决方案:CORS 参考文章: (1)C#进阶系列--WebApi 跨域问题解决方案:CORS (2)https://www.cnblogs.com/landea ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
- C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design
继承与面向对象设计 Inheritance and Object-Oriented Design 面向对象编程已经风靡编程界,关于继承.派生.virtual函数等等需要深入了解. 32.确定你的pub ...
- NAS群晖DSM 进阶教程 篇三:DSM 4458 升级 DSM 4493 update7
WOW唤醒NAS手机APP: Windows Phone 8.1测试可用"Wake my PC"的详细信息 http://www.windowsphone.com/s?app ...
最新文章
- CentOS 7安装Zabbix 3.4
- h5 video 手机上无法显示_手机镜象投屏到电视上全屏显示
- prop在java中_jquery中attr和prop的区别
- 学习OpenCV时 ,添加:#includeopencv2/core/core.hpp等头文件出现无法编译的错误
- AES加密,解决了同步问题,和随机密钥和固定密钥,多端通信加密不一致解决办法...
- k8s-controller manager原理分析
- oracle数据库菜鸟入门
- 谷歌app使用的是什么字体_如何使用Google字体
- Java常见算法(一)
- 一文了解新营销,数字经济时代如何以个人为中心重建品牌?
- 量子力学在计算机上的应用论文,量子力学论文.doc
- mysql一文整理汇总
- VSCode常见问题汇总(持续更新中)
- php直播表情美颜的实现,如何在直播中实现优质的美颜SDK效果
- 程序员必看:一款巨好用的免费简历“神器”(据说有了它,再也不发愁找工作啦!)
- 长白山项目开发小组,day1
- C# 改变DataGridView标题行的边框颜色
- 为什么硬盘插在计算机上不显示,硬盘插在电脑上不显示怎么办
- random.seed(seed)、np.random.seed(seed)、torch.manual_seed(seed)作用
- c语言数组从小到大冒泡排序,C语言冒泡排序将一个数组按照从小到大进行排序...
热门文章
- 计算获取最小值和最大值
- JavaSE简单实现多线程聊天
- [转载]析构函数的虚析构和非虚析构调用的差别
- C#正则表达式开源工具
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
- 0421 AutoLayout的实践/基本使用
- C# 线程手册 第三章 使用线程 Monitor.TryEnter()
- Linq 学习笔记(二)
- [dp]Leetcode 5. Longest Palindromic Substring
- [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]