【问题标题】:Is it possible to use API versioning for specific methods within a controller in ASP.NET Core?是否可以在 ASP.NET Core 的控制器中对特定方法使用 API 版本控制?
【发布时间】:2021-01-18 12:40:42
【问题描述】:

我正在使用 Microsoft.AspNetCore.Mvc.Versioning (v4.1) 提供的 API 版本控制方法。 所以在启动类中我有以下内容:

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllers();

  services.AddMvc(options => options.Filters.Add<ExceptionFilter>());

  services.AddApiVersioning(options =>
  {
      options.ApiVersionReader = new MyCustomVersionReader(configuration);
      options.AssumeDefaultVersionWhenUnspecified = false;
      options.ReportApiVersions = true;
      options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);
  });            
}

然后我可以在控制器中添加注释 [ApiVersion("1.0")] 到控制器或单个方法。

[HttpGet]
[ApiVersion("1.0")]
public async Task<IActionResult> Get() {...}

使用这个,所有对 api 的调用都必须在请求标头中包含版本信息。

但是,控制器中的特定方法是否可能不需要版本?

例如

[HttpGet]
[ApiVersion("1.0")]
public async Task<IActionResult> Method1() {...} //requires version in header

[HttpGet]
public async Task<IActionResult> Method2() {...} //does not require version in header

当我尝试上述方法时(省略 Method2 的 ApiVersion 注释),我仍然收到以下错误:

'需要 API 版本,但未指定。'

感谢您的帮助!

【问题讨论】:

  • AddApiVersioning定义中设置options.DefaultApiVersion = new ApiVersion(1, 0);
  • 这是否意味着版本控制变得可选?这个想法是有一个版本信息是强制性的方法,以及一个不需要版本控制的方法。
  • 它将版本控制添加到所有操作。如果未在(操作或控制器)上定义属性,则版本将被视为默认为 1.0。如果指定,则将使用指定的属性值。
  • 不需要版本意味着我们可以将其版本理解为任何值的默认值(实际上没有意义)。所以在这种情况下,我认为使用默认版本的1.0 很好。但是,可能还有其他方法可以通过使用版本控制扩展包来处理。我还没用过所以不确定。

标签: c# asp.net-core


【解决方案1】:

我认为你可以使用[ApiVersionNeutral]属性。你可以在下面看到我的演示。

首先在你的启动中添加:

 options.Conventions.Controller<HomeV1Controller>().HasApiVersion(new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0));

然后在你的HomeV1Controller:

[Route("api/[controller]")]
[ApiController]
public class HomeV1Controller : ControllerBase
{
    [HttpGet("get")]
    public string Get() => "Ok1";

    [HttpGet("getv2")]
    [ApiVersionNeutral]
    public string GetV2() => "Ok2";
}

测试结果:

【讨论】:

  • 哇,谢谢!这完美地工作。我不知道这个属性。
猜你喜欢
  • 2021-06-19
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多