C# 核心2.1 API版本控制操作模糊性
我已经在我的核心2.1 API项目中成功地设置了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>请求匹配多
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
不明确