zoukankan      html  css  js  c++  java
  • [水煮 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 的请求。

    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 正确处理。

  • 相关阅读:
    POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
    POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
    POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
    POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
    HDU 4638 Group ★(树状数组)
    HDU 4638 Group ★(树状数组)
    HDU 4632 Palindrome subsequence (区间DP)
    HDU 4632 Palindrome subsequence (区间DP)
    hdu2604 Queuing
    poj3757 Training little cats
  • 原文地址:https://www.cnblogs.com/shuizhucode/p/6148326.html
Copyright © 2011-2022 走看看