C# 核心2.1 API版本控制操作模糊性

C# 核心2.1 API版本控制操作模糊性,c#,asp.net-web-api,asp.net-core,api-versioning,C#,Asp.net Web Api,Asp.net Core,Api Versioning,我已经在我的核心2.1 API项目中成功地设置了API版本控制 http://localhost:8088/api/Camps/ATL2016/speakers?api-版本=x.x 版本1.1和2.0工作正常,但1.0失败,导致Get(string,bool)操作不明确 ASP.NET核心Web服务器: MyCodeCamp>fail:Microsoft.AspNetCore.Mvc.Routing.DefaultAPVersionRoutePolicy[1] MyCodeCamp>请求匹配多

我已经在我的核心2.1 API项目中成功地设置了API版本控制

http://localhost:8088/api/Camps/ATL2016/speakers?api-版本=x.x

版本
1.1
2.0
工作正常,但
1.0
失败,导致
Get(string,bool)
操作不明确

ASP.NET核心Web服务器:

MyCodeCamp>fail:Microsoft.AspNetCore.Mvc.Routing.DefaultAPVersionRoutePolicy[1]
MyCodeCamp>请求匹配多个操作,导致不明确。匹配操作:
MyCodeCamp.Controllers.Speakers2Controller.Get(string,bool)(MyCodeCamp)
MyCodeCamp>MyCodeCamp.Controllers.SpeakersController.Get(string,bool)(MyCodeCamp)
MyCodeCamp>fail:Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
MyCodeCamp>执行请求时发生未处理的异常。
MyCodeCamp>Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException:多个操作
匹配。以下操作与路线数据匹配,并满足所有约束条件:

控制器
Speakers2
[ApiVersion(“2.0”)]
装饰,所以它是
Get(string,bool)
操作是版本2.0,那么为什么
版本控制不能区分它们呢

Microsoft.AspNetCore.Mvc.Versioning 3.0.0
(由于版本冲突,无法安装更高版本)

Startup.cs:

  services.AddApiVersioning(cfg =>
    { cfg.DefaultApiVersion = new ApiVersion(1, 1);
      cfg.AssumeDefaultVersionWhenUnspecified = true;
      cfg.ReportApiVersions = true;     });
控制器:

  [Route("api/camps/{moniker}/speakers")]
  [ValidateModel]
  [ApiVersion("1.0")]
  [ApiVersion("1.1")]
  public class SpeakersController : BaseController
  { 
    . . . 
    [HttpGet]
    [MapToApiVersion("1.0")]
    public IActionResult Get(string moniker, bool includeTalks = false)

    [HttpGet]
    [MapToApiVersion("1.1")]
    public virtual IActionResult GetWithCount(string moniker, bool includeTalks = false)

  [Route("api/camps/{moniker}/speakers")]
  [ApiVersion("2.0")]
  public class Speakers2Controller : SpeakersController
  {
    ...
    public override IActionResult GetWithCount(string moniker, bool includeTalks = false)

显然,版本控制与多个
Getxxx
IActionResult
s相混淆

我通过在
扬声器
控制器
虚拟
中执行
Get
操作,然后在
扬声器2
控制器
中将其作为一个不会被调用的占位符来覆盖,从而使其正常工作。我还必须将
[ApiVersion(“2.0”)]
仅应用于
GetWithCount
操作,而不是
控制器

[Authorize]
[Route("api/camps/{moniker}/speakers")]
[ValidateModel]
[ApiVersion("1.0")]
[ApiVersion("1.1")]
public class SpeakersController : BaseController

  [HttpGet]
  [MapToApiVersion("1.0")]
  [AllowAnonymous]
  public virtual IActionResult Get(string moniker, bool includeTalks = false)



[Route("api/camps/{moniker}/speakers")]
public class Speakers2Controller : SpeakersController

  public override IActionResult Get(string moniker, bool includeTalks = false)
  {  return NotFound(); }

  [ApiVersion("2.0")]
  public override IActionResult GetWithCount(string moniker, bool includeTalks = false)

您以前的实现无法工作的原因是
[ApiVersion]
[MapToApiVersion]
未继承。这似乎有悖常理,但如果是这样,那么每个子类都会不断累积API版本。在第二个实现中,您没有覆盖原始的
Get
,因此它隐式地成为控制器指定的
2.0
。这就是为什么您会看到重复项,因为它现在与
GetWithCount
不明确