WebApi-2 自定义路由与默认路由
向Web API添加路由
public static void Register(HttpConfiguration config)
{
//// Web API 配置和服务
//// 将 Web API 配置为仅使用不记名令牌身份验证。
//config.SuppressDefaultHostAuthentication();
//config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); // Web API 启用特性路由
config.MapHttpAttributeRoutes();
//1.默认路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d*" } //约束,这个表示匹配0个或多个数字
//constraints: new { id = @"\d+" } //正则\d+表示匹配一个或多个数字
); //2.自定义路由一:匹配到action
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "actionapi/{controller}/{action}/{id}", //将路由模板的前缀改成了“actionapi”。
defaults: new { id = RouteParameter.Optional }
); //3.自定义路由二
config.Routes.MapHttpRoute(
name: "TestApi",
routeTemplate: "testapi/{controller}/{ordertype}/{id}",
defaults: new { ordertype = "aa", id = RouteParameter.Optional }//只要{ordertype}按照路由规则去配置,都能找到对应的方法。
);
}
Web API路由过程
1、WebApi服务启动之后,会执行全局配置文件Global.asax.cs的 protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);} 方法,通过参数委托执行WebApiConfig.cs里面的 public static void Register(HttpConfiguration config) 这个方法,将所有配置的路由信息添加到 HttpRouteCollection 对象中。查看配置对象,我们会发现Routes属性指向HttpRouteCollection类的一个实例,而不是ASP.NET的RouteCollection类实例。Web API提供了一些直接依赖ASP.NET中RouteCollection类的MapHttpRoute版本,但这些路由只有在Web托管时才能使用,因此推荐使用HttpRouteCollection上的MapHttpRoute版本。
2、当我们发送请求到WebApi服务器的时候,比如我们访问http://localhost:21528/api/Order这个url的时候,请求首先还是会被UrlRoutingModule监听组件截获,然后,将截获的请求在Routes路由集合中匹配到对应的路由模板(如果匹配不到对应的路由模板,则返回404),得到对应的IHttpRoute对象。IHttpRoute对象是Routes集合里面匹配到的一个实体。
3、将IHttpRoute对象交给当前的请求的上下文对象RequestContext处理,根据IHttpRoute对象里面的url匹配到对应的controller,然后再根据http请求的类型和参数找到对应的action。这样一个请求就能找到对应的方法了。
一个请求过来之后,路由主要需要经历三个阶段
- 根据请求的url匹配路由模板
 - 找到控制器 (反编译路由模块的代码,你会发现控制器的选择主要在IHttpControllerSelector这个接口的SelectController()方法里面处理。)
 - 找到action (得到了控制器对象之后,Api引擎通过调用IHttpActionSelector这个接口的SelectAction()方法去匹配action。)
 
使用特性路由
如果http请求的方法相同(比如都是post请求),并且请求的参数也相同。我们可以在路由模板里面加上“{action}”,但是不提倡。推荐使用特性路由解决这个问题。下面代码说明如何如何使用特性路由。
[RoutePrefix("api/order")] //同一个控制器的所有的action的所有特性路由标识一个相同的前缀,这种做法并非必须,但这样能够增加url的可读性。
    public class OrderController : ApiController
    {
        [HttpGet]
        public object GetAll()
        {
            return "Success";
        }
        [ActionName("TestApi")]  //如果你想要方法名和action的名称不一致,你也可以自定义action的名称,这个可以通过特性ActionName来实现
        [Route("{id:int=3}/OrderDetailById")]  //使用“{}”占位符动态传递参数,参数约束:这里约束可变部分{id}的取值必须是int类型。并且默认值是3.
        [HttpGet]
        public object GetById(int id)
        {
            return "Success" + id;
        }
        [HttpGet]
        public async Task<string> Get(string str)
        {
            GetDataHelper sqlHelper = new GetDataHelper();
            switch (str)
            {
                case "异步处理"://
                    return await sqlHelper.GetDataAsync();
                case "同步处理"://
                    return sqlHelper.GetData();
            }
            return "参数不正确";
        }
    }
WebApi-2 自定义路由与默认路由的更多相关文章
- vue 路由 以及默认路由跳转
		
https://router.vuejs.org/ vue路由配置: 1.安装 npm install vue-router --save / cnpm install vue-router --sa ...
 - Vue中的路由 以及默认路由跳转
		
https://router.vuejs.org/ vue路由配置: 1.安装 npm install vue-router --save / cnpm install vue-router --sa ...
 - 在ensp上静态路由以及默认路由基本配置
		
原理 实验模拟 实验拓扑 实验参数 测试连通性 两台PCping一下,发现超时 为什么呢我们可以看一下这个路由表,发现没有网段为20的信息,所以我们要加上 加入当访问地址为20网段时,设置下一跳路由器 ...
 - IT菜鸟之路由器基础配置(静态、动态、默认路由)
		
路由器:连接不同网段的设备 企业级路由和家用级路由的区别: 待机数量不同(待机量) 待机量:同时接通的终端设备的数量 待机量的值越高,路由的性能越好 别墅级路由,表示信号好,和性能无关 交换机:背板带 ...
 - CCNP路由实验之八 路由重公布
		
 CCNP路由实验之八 路由重公布 在前面几个实验,已经学习了静态路由和动态路由.如今,我们要掌握怎样使它们在一个网络中融合,即路由重公布. 使用出站口作为静态路由 0 使用下一跳地址作为静态路由 ...
 - 华为eNSP路由交换-静态路由
		
静态路由 一. 静态路由及默认路由基本配置 1.1实验内容 在由三台路由器所组成的简单网络中,R1和R3各连着一台PC,现在要求能够实现PC-1和PC-2之间的通信.本实验将通过配置基本的静态路由和默 ...
 - IP路由__静态路由
		
1.静态路由的优缺点: 优点:对于路由器的CPU没有管理性开销,它意味着如果你不使用动态路由选择的话,你可能应该购买更为便宜的路由器.在路由器之间没有带宽占用,它意味着在WAN链接中你可以节省更多的钱 ...
 - MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等
		
引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Hom ...
 - springboot+zuul(一)------实现自定义过滤器、动态路由、动态负载。
		
参考:https://blog.csdn.net/u014091123/article/details/75433656 https://blog.csdn.net/u013815546/articl ...
 
随机推荐
- Angular 基本内置服务和筛选器
			
AngularJS中的内置服务(共30多个): $http 发送http请求,主要用于进行异步数据请求的功能实现,这个服务主要封装了XMLHttpRequest对象和JSONP数据访问模式来完成远程请 ...
 - CLOUD配置审批流发消息
			
1.进入流程中心-工作流-流程设计中心 2.新增物料管理冻结流程 3.进入修改配置项 4.新消息节点 5.写入消息标题,内容等 6.填入接收人 7.保存后发布 8.进入流程配置中心 9.捆绑并启用 1 ...
 - sqlserver2008R2 评估期已过
			
早上打开win程序-卡死不动了,查看三层数据库连接-连接不上数据库 打开数据库-提示 评估期已过 解决方法: 进入sqlserver的安装中心-点击 维护-版本升级 输入密钥:企业版:R88PF-GM ...
 - 简述layui前端ui框架的使用
			
官方网址:https://www.layui.com/demo/upload.html
 - Kafka如何保证消息的可靠性传输
			
1.消费端弄丢了数据 唯一可能导致消费者弄丢数据的情况,就是说,你消费到了这个消息,然后消费者那边自动提交了 offset,让 Kafka 以为你已经消费好了这个消息,但其实你才刚准备处理这个消息,你 ...
 - Vue组件开发
			
在学习vue的时候,发现有很多使用vue开发的ui组件.本着学习的目的,自己也仿照Element写一些组件. 使用VuePress编写组件文档. 单元测试:karma+mocha+chai+sinon ...
 - [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP
			
题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...
 - Python并发编程之多线程使用
			
目录 一 开启线程的两种方式 二 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别 三 练习 四 线程相关的其他方法 五 守护线程 六 Python GIL(Global Interpret ...
 - python类的两种创建方式
			
参考: https://blog.csdn.net/likunkun__/article/details/81949479
 - git 本地项目推到远程仓库
			
…or create a new repository on the command line echo "# blog" >> README.mdgit initgi ...