[水煮 ASP.NET Web API2 方法论](3-6)万能路由
问题
定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获?
解决方案
在路由模板中,给参数添加一个“*”前缀,例如 {*param},只要请求的 URL 能够和路由模板其余的部分匹配,这样的请求会被全部捕获。这个不仅适用于集中式路由,也试用于属性路由。
工作原理
如果整个路由模板只是 {*param},那么,请求 URL 的整个相关部分,都会被当作字符串参数传入到 Action 的,可以在 Action 内部处理或者转。
如果有一些其他路由模板段在 {*param} 前面,这些路由模板也是会被匹配的,URL 中的参数位置将会被作为字符传给相应 Action。
注意 因为使用 “*” 的路由参数意味着全部匹配,必须把这段放在路由模板的最后。例如,{*param}/{id} 是没有意义的,因为 {*param} 类似一种短路操作,所以“id”的值永远不会被读到。
万能的典型应用场景是,需要使用 ASP.NET Web API 作为代理,只是为了转向到其他系统。如果允许客户端通过 URL 传入复杂查询语句的时候,也可以使用这个万能路由。
代码演示
代码片段 3-17 展示了万能路由在集中式路由和属性路由的定义方式。
代码片段 3-17. WEB API 的万能路由定义例子
在上面的两个例子中,都属类似短路一样的路由,因为,他们会处理所有发给 Web API 的请求。
- GET myapi.com/1
- GET myapi.com/hello
- GET myapi.com/www.cnblogs.com
- GET myapi.com/monday/code/111
如果万能路由和常规路由共存的话,常规的做法就是,把参数 {*param} 放在一个特殊段的后面。如代码片段 3-18 所示,仅仅是低于 3-17 的简单修改。
代码片段 3-18.仅仅针对 myapi.com/proxy/{*param} 完全捕获
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "proxy/{*params}"
); public class ProxyController : ApiController
{
[Route("proxy/{*params}")]
public HttpResponseMessage Get(string params)
{
// 忽略业务
}
}
路由定义这样的改变带来路由匹配上的变化是,只要请求 URL 是以 “proxy” 开始,就会被上面定义的路由匹配到。例如,myapi.com/proxy/www.cnblogs.com。所有其他的请求仍然可被 Web API 相关 Controller 正确处理。
[水煮 ASP.NET Web API2 方法论](3-6)万能路由的更多相关文章
- [水煮 ASP.NET Web API2 方法论](3-5)路由约束
问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...
- [水煮 ASP.NET Web API2 方法论](3-3)路由默认值
问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...
- [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置
阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...
- [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项
问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...
- [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)
问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...
- [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器
阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...
- [水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute
问题 在 Controller 中有一个 public 的方法,但是又不想将这个 publlic 方法暴露成为一个 API. 解决方案 ASP.NET Web API 中,正常是通过 HTTP 谓词来 ...
- [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由
问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...
- [水煮 ASP.NET Web API2 方法论](3-1)集中式路由
问题 怎样集中的定义路由 解决方案 通过调用 HttpRouteCollectionExtension 类中的 MapHttpRoute 扩展方法在 HttpRouteCollection 中定义路由 ...
随机推荐
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...
- Setting up SSL for SCM-Manager with Microsoft CA and TortoiseHg
You can configure SSL for SCM-Manager so that the communication of your repositories are encrypted. ...
- Atitit 函数式编程与命令式编程的区别attilax总结 qbf
Atitit 函数式编程与命令式编程的区别attilax总结 qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...
- fir.im Weekly - 聊聊让人向往的远程开发工作
6月30 日,苹果开发者后台贴出一封关于广电总局的醒目通知,申报一个游戏 APP 上架AppStore,你需要文网文+ICP证+软著+版号,审批难度将越来越大,不禁让人感慨中国独立开发者的成长 &qu ...
- vue for 绑定事件
vue for 绑定事件 <div id="pro_list" v-for="item in pro_list"> <div class=&q ...
- [javascript]模拟汉诺塔
看了博文自己动手写了代码. 这能值几个钱? 请写代码完成汉诺塔的算法:void Hanoi(int maxLevel); 比如2层汉诺塔,需要打印(Console.WriteLine)出如下文本: A ...
- ROC曲线与AUC值
本文根据以下文章整理而成,链接: (1)http://blog.csdn.net/ice110956/article/details/20288239 (2)http://blog.csdn.net/ ...
- 【WP8.1开发】基于应用的联系人存储
上一篇文章所吹的牛是访问系统(手机)上的联系人,当然那只是读不能改,这是自然的,要是让你能随便修改用户的联系人信息的话,那后果很严重,有些恶意开发者就有可能把”你的户口改成猪“. 但是,API也允许应 ...
- hdu4292Food(最大流Dinic算法)
/* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!f-food, p-people, d-drink 建图: 0(源点 ...
- 《BI那点儿事》Microsoft 决策树算法——找出三国武将特性分布,献给广大的三国爱好者们
根据游戏<三国志11>武将数据,利用决策树分析,找出三国武将特性分布.其中变量包括统率.武力.智力.政治.魅力.身分.变量说明:统率:武将带兵出征时的部队防御力.统帅越高受到普通攻击与兵法 ...