【问题标题】:API versioning in .NET application.NET 应用程序中的 API 版本控制
【发布时间】:2017-05-18 14:06:20
【问题描述】:

我需要澄清一下 .Net Core 框架中的 API 版本控制。

我的客户希望在路由器级别处理版本。喜欢

[Route("1/[controller]")]
public class SampleController : Controller
{
    [HttpGet("version")]
    public IActionResult GetVersion()
    {
        return Ok({"Message": "API Version 1"});
    }
}

我使用 https://www.somedomain.com/api/1/sample/version 访问它

在 IIS 中,我将在默认网站下创建一个名为 'api' 的应用程序(我的 URL 中的路径 'api' 将在此处处理)并在此处托管我的代码。

为了进行 API 版本控制,我可以在这里遵循什么更好的方法。

  1. 我可以这样做吗?

    [ApiVersion("1")]
    [Route("{version:apiVersion}/[controller]")]
    public class SampleController : Controller
    {
        [HttpGet("version")]
        public IActionResult GetVersion()
        {
           return Ok({"Message": "API Version 1"});
        }
    
        [HttpGet("version"), MapToApiVersion("2" )]
        public IActionResult GetVersion()
        {
            return Ok({"Message": "API Version 2"});
        }
    }
    
  2. 是否可以在 IIS 中的应用程序下创建应用程序。喜欢,

默认网站 -> api -> 1 -> 未提及 API 版本的代码

默认网站 -> api -> 2 -> 没有提及 API 版本的更新代码

  1. 或者我可以在 IIS 中将版本创建为应用程序并在每个应用程序版本下部署代码。喜欢,

默认网站 -> 1 -> 未提及 API 版本的代码

默认网站 -> 2 -> 没有提及 API 版本的更新代码

这最终会改变我不喜欢的 API URL。我仍然想使用相同的 URI。
我使用 https://www.somedomain.com/api/1/sample/version

访问它

请在此处建议我可以遵循的最佳方法。

【问题讨论】:

  • 你的 api 的不同版本有不同的项目还是在同一个项目中?
  • 我仍在使用 API 的第 1 版。我更喜欢有相同的项目。

标签: asp.net api iis api-versioning


【解决方案1】:

Here 是一个流行的存储库,它提供了一组库,用于将 API 版本控制添加到 ASP.NET Web API、带有 ASP.NET Web API 的 OData 和 ASP.NET Core 应用程序。

对于 ASP.NET Core 应用程序,您可以通过在包管理器控制台中运行以下命令来install此存储库的 ASP.NET Core API 版本控制:

Install-Package Microsoft.AspNetCore.Mvc.Versioning

【讨论】:

    【解决方案2】:

    也许ApplicationBuilder的Map扩展方法适合你的需求:

    app.Map( "/1", myVersion1MappingFunction)
    

    在 Startup 的 Configure 方法中让 myVersion1MappingFunction 配置一个单独的中间件管道:

    private static void myVersion1MappingFunction( IApplicationBuilder app)
    {
       // start your special middleware for version 1
       app.UseMvc( routes =>
       {
           routes.MapRoute( ... );
       }
    }
    

    在使用 Map 扩展时,片段 ("/1") 将从 HttpRequest.Path 中删除

    【讨论】:

      【解决方案3】:

      如果我理解正确,您希望对 ASP.NET Core 使用 URL 路径段版本控制。有了您的示例中所说的,您将部署单独的网站。您部署了一个网站,但您在默认网站下创建多个版本控制应用程序。

      通过 URL 路径段版本控制,您拥有一个 Web 应用程序,该应用程序使用 ApiVersion 约定管理所有路由。您将需要以这样的方式维护代码,以便它可以提供旧功能和新功能并管理所有依赖项。

      我建议您阅读 Microsoft 对此 here 的评论,并做一个对您的实施有意义的简单概念证明。

      我希望这有助于消除您对多次部署应用程序以进行版本控制的困惑。

      【讨论】:

      • 小订单。这通常是正确的,但您可以将您的应用程序拆分为多个应用程序。要实现这一点,您几乎肯定需要一个 网关 来路由到正确的应用程序端点。为确保报告 API 版本仍然有效,您需要宣传所有应用程序的 API 版本。这在this wiki 主题中进行了简单讨论。 如何您宣传您的 API 版本或实施网关可能会有很大差异。
      【解决方案4】:

      在您的情况下,最好的方法是使用 Web 服务器级别的版本控制,这样您就可以拥有不同的部署和每个版本的文件夹,而无需在应用程序路由本身中指定版本。 (你的选择 2/3?)

      但是,与 asp.net 不同,由于 IIS 仅使用 .net 核心代理对 kestrel 的请求,因此您必须通过使用 ARR 的 URL/URL 重写设置反向代理到不同版本的部署。

      所以你可以:

      1. /root/V1/
      2. /root/V2/
      3. 等等...就像你解释的那样。

      每个部署都将运行具有不同端口号的 kestrel,并且 IIS 将通过 URL 反向代理到它们。

      这是一篇关于如何使用 url-write 设置 ARR 的文章。它是用 asp.net 编写的,但原理相同:

                Reverse Proxy with URL Rewrite v2 and Application Request Routing

      【讨论】:

      • 在 API 领域,这是一个危险的假设。没有任何明示或暗示的保证,两个 API 版本是兼容的。许多服务作者认为,如果事情与他们向后兼容,那么客户端会很好。那明显是错的。服务器不能保证客户端使用容错阅读器或向后兼容。简单地将/api/api/v1 更改为/api/v2 可能会破坏客户端。这种行为是很好的 UI 和浏览器,因为它们都可以理解 application/html
      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2014-03-25
      • 2011-12-22
      • 2021-09-11
      • 2014-10-26
      相关资源
      最近更新 更多