问题

定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获?

解决方案

在路由模板中,给参数添加一个“*”前缀,例如 {*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 的请求。

  1. GET myapi.com/1
  2. GET myapi.com/hello
  3. GET myapi.com/www.cnblogs.com
  4. 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)万能路由的更多相关文章

  1. [水煮 ASP.NET Web API2 方法论](3-5)路由约束

    问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...

  2. [水煮 ASP.NET Web API2 方法论](3-3)路由默认值

    问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...

  3. [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置

    阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...

  4. [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项

    问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...

  5. [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)

    问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...

  6. [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器

    阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...

  7. [水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute

    问题 在 Controller 中有一个 public 的方法,但是又不想将这个 publlic 方法暴露成为一个 API. 解决方案 ASP.NET Web API 中,正常是通过 HTTP 谓词来 ...

  8. [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由

    问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...

  9. [水煮 ASP.NET Web API2 方法论](3-1)集中式路由

    问题 怎样集中的定义路由 解决方案 通过调用 HttpRouteCollectionExtension 类中的 MapHttpRoute 扩展方法在 HttpRouteCollection 中定义路由 ...

随机推荐

  1. 如何开始DDD(完)

    连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public class Domai ...

  2. python sorted排序

    python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...

  3. Git学习笔记(6)——Bug和Feature分支

    本文主要记录了通过Git来调试Bug和添加新的功能,也就是Bug分支和Feature分支,以及分支的推送. Bug分支 通过Git,我们可以为每个Bug建立一个分支,Bug修复后,合并分支,然后将临时 ...

  4. Java处理Radius access-challenge

    最近使用 RSA Authentication Manager, 并且与其自带的Radius server整合, RSA的Radius server 配置不太透明, 目前只配成功了PAP方式的验证,C ...

  5. IOS Runtime-初识runtime(一)

    苹果公布了runtime的源码,可以从地址下载:http://www.opensource.apple.com/tarballs/objc4/ object-c程序在启动的时候,需要一个准备时间,这个 ...

  6. osgi 1

    Helloworld入门 准备: eclipse 3.4 需要jar,—— eclipse 自带的,plugin下面有很多,抛开里面的jar,很多都是当前项目不需要的,如果不适用eclipse而是直接 ...

  7. PMO到底什么样?(3)

    继续上一篇,PMO到底什么样?到这篇,本文就结束啦. 出色基地COE,4大典型职责 咱们知道悉数的公司,它都是要不断地持续改进和优化,包含公司内组织级的项目处理的机制,也需要不断的优化和进步.一般咱们 ...

  8. MVVM架构~knockoutjs系列之验证成功提示显示

    返回目录 对于knockout.validation来说,我们已经知道了如何去验证大部分表单元素,而有时,我们的需求希望在每个元素验证成功后,去显示正确的提示,这个我们很容易的使用self.元素.is ...

  9. JS的prototype和__proto__ Constructor

    一.prototype和__proto__的概念 prototype是 注意是 只有函数的一个属性才有的(每个函数都有一个prototype属性),这个属性是一个指针,指向一个普通对象并且不是原型对象 ...

  10. salesforce 零基础学习(十八)WorkFlow介绍及用法

    说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...