【问题标题】:web api 2 routing with version and route attributes具有版本和路由属性的 web api 2 路由
【发布时间】:2015-07-19 03:56:48
【问题描述】:

在我的项目中,我有 2 个版本的 API。从此Post 我了解到自定义控件选择器需要编写,以便获得不同的版本(因为 webapi 查找控制器名称匹配并忽略它们所在的命名空间)。

这一切正常,我可以调用不同的版本。

但是,我也使用了来自 web api 2 的新数据属性路由,使用此选项时,客户控制选择器无法正确处理路由。

我使用的路由数据属性如下。

(V01版本不同所以可以是V02)

[Route("api/v01/enumeration/{type}/{subtype}")]

这也可以在末尾包含一些额外的查询字符串参数

[Route("api/V01/user/readbyreference")] 

这需要?id=EMAIL|email.domain.com的查询字符串

客户控制选择器的代码可以在here找到

我可以看到问题在于 GetRouteVariable 获取所需的命名空间部分和控制器,但我想知道是否有其他人不得不做这样的事情,以及他们是否有任何解决方法。

我会调查,所以如果我找到了我会在这里更新的东西,但是如果你有任何事情请告诉我。

谢谢

标记

【问题讨论】:

    标签: c# asp.net-mvc-5 asp.net-web-api2 asp.net-mvc-routing


    【解决方案1】:

    经过一番挖掘,我发现属性路由通过不同的路径。

    因此,要处理GetRouteVariable 中的属性路由,您需要获取MS_SubRoutes 值,然后对结果执行所需的操作以获取命名空间和控制器。 以下内容需要整理,但它至少让您了解如何在自定义控件选择器中处理数据属性路由

    var subroutes = (IEnumerable<IHttpRouteData>)routeData.Values["MS_SubRoutes"];
    var routeBreakDown= subroutes.First().Route.RouteTemplate.Split('/');
    if (name == "namespace")
    {
        return (T)(object)routeBreakDown[1]; //namespace
    }
    else if (name == "controller")
    {
        return (T)(object)routeBreakDown[2]; //controller
    }
    

    干杯 标记

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2014-04-19
      • 2014-05-28
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多