2

我需要对 .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访问它

请告知我可以在此处遵循的最佳方法。

4

4 回答 4

1

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

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

Install-Package Microsoft.AspNetCore.Mvc.Versioning
于 2017-01-16T19:28:18.803 回答
0

也许 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

于 2017-01-11T15:19:33.743 回答
0

在您的情况下,最好的方法是使用 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 编写的,但原理相同:

          具有 URL Rewrite v2 和应用程序请求路由的反向代理

于 2017-01-14T16:57:45.463 回答
0

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

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

我建议在这里阅读微软对此的看法,并做一个对您的实施有意义的简单概念证明。

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

于 2017-01-13T13:38:59.110 回答