使用多个名称空间时路由表中缺少属性路由

时间:2015-12-22 22:03:30

标签: asp.net rest asp.net-web-api url-routing

我在web api(4.0)项目中使用命名空间版本控制。我正在使用属性路由为我们的操作定义自定义路由。当控制器只存在于一个命名空间/版本中时,这很好用。

但是当两个命名空间/版本中都存在控制器时,将完全忽略属性路由。我正在使用解决方案here来查看路由表中的路由。它只包含一条路线,对于我的“单一”控制器。如果我在V2中删除/注释掉/更改控制器的名称,那么突然“双”控制器的路由也会出现在路由表中。

是否有任何理由会忽略属性路由,因为2个不同的命名空间中存在相同的类/控制器名称?这是我的代码,细分为最简单的失败示例:

namespace API.v1
{
    public class SingleController : ApiController
    {
        [HttpGet]
        [Route("api/{version}/Single")]
        public string Test()
        {
            return "Response";
        }
    }
}

这个班级/路线工作得很好。 http://localhost:57560/api/v1/Single返回“响应”。

namespace API.v1
{
    public class DoubleController : ApiController
    {
        [HttpGet]
        [Route("api/{version}/Double")]
        public string Test()
        {
            return "Response";
        }
    }
}

namespace API.v2
{
    public class DoubleController : ApiController
    {
        [HttpGet]
        [Route("api/{version}/Double")]
        public string Test()
        {
            return "Response";
        }
    }
}

这两个班级失败了;路由表中缺少属性路由,http://localhost:57560/api/v1/Double返回404,以及http://localhost:57560/api/v2/Double。如果我只是更改v2.Double类的名称,那么它可以正常工作。

在这个例子中,我根本没有设置默认路由;只有属性路由。使用默认路由时,版本控制和路由工作正常:

config.Routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "api/{version}/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

此路线适用于多个版本。但是我需要它来处理属性路由。

2 个答案:

答案 0 :(得分:1)

我已经能够使用此处的解决方案解决问题:http://abhinawblog.blogspot.com/2014/12/web-api-versioning-using.html。问题似乎与属性路由与使用默认路由表的方式不同有关。要求路由具有唯一的名称,并且路由中的版本号具有自定义约束。

答案 1 :(得分:0)

为了使命名空间版本控制成为可能,您需要覆盖路由的默认行为。查看此MSDN Link了解详情

同时检查此sample code以查看其完成情况