我在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 }
);
此路线适用于多个版本。但是我需要它来处理属性路由。
答案 0 :(得分:1)
我已经能够使用此处的解决方案解决问题:http://abhinawblog.blogspot.com/2014/12/web-api-versioning-using.html。问题似乎与属性路由与使用默认路由表的方式不同有关。要求路由具有唯一的名称,并且路由中的版本号具有自定义约束。
答案 1 :(得分:0)
为了使命名空间版本控制成为可能,您需要覆盖路由的默认行为。查看此MSDN Link了解详情
同时检查此sample code以查看其完成情况