c# - 如何在 ASP.NET Core Web Api 中完成版本控制

标签 c# asp.net asp.net-web-api asp.net-core

在之前的 asp.net web api 中,我实现了 DefaultHttpControllerSelector 来指定我希望请求如何定位我的 Controller 。我经常有不同名称但用于相同进程的不同 Controller 。唯一的区别是一个版本比另一个版本高。

例如,我可以有一个名为 BookingV1Controller 的 Controller ,用于处理服务的第一个版本。我还会有 BookingV2Controller,它旨在处理服务的第二个版本。然后,客户端应用程序将使用此 url http://myservice.com/api/v2/booking/someaction?id=12 向服务发出请求。为了处理请求,我将提供 DefaultHttpControllerSelector 的自定义实现,以根据请求的版本选择所需的适当 Controller 版本。

但是,我似乎没有办法在 ASP.NET Core 中执行此操作。我到处搜索都无济于事。也没有可以提供帮助的文档。

如果有人能帮到我,我将不胜感激。谢谢。

更新 我还想知道如果在自定义 header 中指定了版本该怎么办。例如 X-Version:v1

更新 2

要求是服务的版本不应该暴露在 URL 中。如果不存在版本,则服务会返回有关如何添加版本的说明。如果请求的 Controller 不存在于请求的版本中,系统将搜索较低的版本。如果它在任何较低版本中找到它,它就会使用它。这样做的原因是为了防止在所有版本上重复使用 Controller 。但是对于 ASP.NET Core,这可能是不可能的。

最佳答案

这是我偶然发现的一个非常古老的问题,但现在有更好的解决方案。有这个包

Microsoft.AspNetCore.Mvc.Versioning

它具有更丰富的功能来实现版本控制。其中包括能够使用 URL 查询字符串、url 路径、 header 或自定义版本阅读器。能够从 HTTPContext 等读取版本。

简而言之,您将以下内容添加到 startup.cs 中的 ConfigureServices 方法中

services.AddApiVersioning(o => {
    o.ReportApiVersions = true;
    o.AssumeDefaultVersionWhenUnspecified = true;
            o.DefaultApiVersion = new ApiVersion(1, 0);
});

然后你必须用 ApiVersion 装饰你的 Controller 。

[ApiVersion("1.0")]
[Route("api/home")]
public class HomeV1Controller : Controller
{
    [HttpGet]
    public string Get() => "Version 1";
}

[ApiVersion("2.0")]
[Route("api/home")]
public class HomeV2Controller : Controller
{
    [HttpGet]
    public string Get() => "Version 2";
}

也可以在路径中实现,放在路由中

[ApiVersion("1.0")]
[Route("api/{version:apiVersion}/home")]
public class HomeV1Controller : Controller
{
    [HttpGet]
    public string Get() => "Version 1";
}

[ApiVersion("2.0")]
[Route("api/{version:apiVersion}/home")]
public class HomeV2Controller : Controller
{
    [HttpGet]
    public string Get() => "Version 2";
}

当你使用这种通过 Microsoft 包实际实现它的方法时,这也意味着你可以弃用版本、进行版本发现、轻松地从 HttpContext 访问版本号等。这些你都做不到如果它只是硬编码在您的 route ,请执行此操作。

更多信息(包括在标题中使用它):

关于c# - 如何在 ASP.NET Core Web Api 中完成版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38304961/

相关文章:

c# - System.Threading.Task 不工作

asp.net - 为 ASP .NET 站点启用 SSL

c# - 用 2 个数字之间的所有数字填充下拉列表

c# - WCF 比运行相同代码的 WebAPI 慢得多

asp.net-web-api - 在 LINQPad 中使用 WebAPI?

c# - 找出差为 K 的数组中的对数?

c# - Gurobi,C# : Can't convert from 'int' to System. Collections.Generic.List<int>

c# - 根据 C# 中的条件从 List<T> 中删除重复项

c# - .NET 4.5 中的任务与线程

javascript - 获取下拉菜单的 Angular 值