在差异控制器C#上具有相同路由名称的API路由版本控制

时间:2019-03-10 03:21:30

标签: c# rest api routing versioning

我收到错误消息-找到了多个与URL匹配的控制器类型。

在我的移动API上,我必须支持多个版本。所有这些都混合到具有覆盖路由属性的单个控制器中。

我的代码就是这样(没有问题)

namespace MyApi 
{
    [RoutePrefix("company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }

        [Route("~/v2/company/users")]
        public List<user> GetUsers_v2() { return new List<User>(); }

        [Route("~/v3/company/users")]
        public List<user> GetUsers_v3() { return new List<User>(); }
    }
}

随着控制器的增长,它变得难以维护。我想将版本拆分为差异控制器,例如

namespace MyApi 
{
    [RoutePrefix("company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}

namespace MyApi.v2
{
    [RoutePrefix("v2/company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}

namespace MyApi.v3
{
    [RoutePrefix("v3/company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}

2 个答案:

答案 0 :(得分:0)

当需要支持向后兼容性时,需要

API版本控制。 尝试使用nuget软件包进行API版本控制。

Nuget:Microsoft.AspNet.WebApi.Versioning

GitHub:aspnet-api-versioning

答案 1 :(得分:0)

[RoutePrefix("api/v2/company")]
public class UseV2Controller : ApiController
{
    [Route("users")]
    public List<user> GetUsers_v2() { return new List<user>(){new user(){ Name ="v2User"} }; }
}

[RoutePrefix("api/v3/company")]
public class UseV3Controller : ApiController
{
    [Route("users")]
    public List<user> GetUsers_v3() { return new List<user>() { new user() { Name = "v3User" } }; }

}

public class user
{
    public string Name { get; set; }
}

我将您的控制器名称更改为UseV2Controller而不是UseControllerV2,与v3相同。然后添加路由前缀api / v2 / company和api / v3 / company