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

 

解决方案

在路由模板中,给参数添加一个“*”前缀,例如 {*param},只要请求的 URL 能够和路由模板其余的部分匹配,这样的请求会被全部捕获。这个不仅适用于集中式路由,也试用于属性路由。

 

工作原理

如果整个路由模板只是 {*param},那么,请求 URL 的整个相关部分,都会被当作字符串参数传入到 Action 的,可以在 Action 内部处理或者转。

如果有一些其他路由模板段在 {*param} 前面,这些路由模板也是会被匹配的,URL 中的参数位置将会被作为字符传给相应 Action。

 

注意 因为使用 “*” 的路由参数意味着全部匹配,必须把这段放在路由模板的最后。例如,{*param}/{id} 是没有意义的,因为 {*param} 类似一种短路操作,所以“id”的值永远不会被读到。

 

万能的典型应用场景是,需要使用 ASP.NET Web API 作为代理,只是为了转向到其他系统。如果允许客户端通过 URL 传入复杂查询语句的时候,也可以使用这个万能路由。

 

代码演示

代码片段 3-17 展示了万能路由在集中式路由和属性路由的定义方式。

代码片段 3-17. WEB API 的万能路由定义例子

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

在上面的两个例子中,都属类似短路一样的路由,因为,他们会处理所有发给 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} 完全捕获

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "proxy/{*params}"
    ); 

public class ProxyController : ApiController
{
    [Route("proxy/{*params}")]    public HttpResponseMessage Get(string params)
    {        // 忽略业务    }
}

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

路由定义这样的改变带来路由匹配上的变化是,只要请求 URL 是以 “proxy” 开始,就会被上面定义的路由匹配到。例如,myapi.com/proxy/www.cnblogs.com。所有其他的请求仍然可被 Web API 相关 Controller 正确处理。

 



[水煮 ASP.NET Web API 2 方法论] 目 录


延伸阅读

告别“老顽固”-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训告别“老顽固”