【问题标题】:API route versioning with same route name on diff controllers C#在差异控制器 C# 上具有相同路由名称的 API 路由版本控制
【发布时间】:2019-03-10 03:21:30
【问题描述】:

我收到错误 - 找到了多个与 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>(); }
    }
}

【问题讨论】:

标签: c# rest api routing versioning


【解决方案1】:

当您需要支持向后兼容性时,需要 API 版本控制。 尝试使用 nuget 包进行 API 版本控制。

Nuget:Microsoft.AspNet.WebApi.Versioning

GitHub:aspnet-api-versioning

【讨论】:

    【解决方案2】:
    [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

    【讨论】:

    • 我编辑了我的新代码。想为每个版本使用不同的命名空间。资源版本(用户、员工等)将被分类到具有相同控制器名称的命名空间中。这样控制器和路由是干净的
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 2015-03-12
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多