c# - Core 2.1 APIVersioning 操作歧义

标签 c# asp.net-web-api asp.net-core api-versioning

我已在 Core 2.1 API 项目中成功设置 API 版本控制。

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

版本 1.12.0 可以工作,但 1.0Get(string, bool) 上的歧义而失败行动。

ASP.NET Core Web 服务器:

MyCodeCamp> 失败:Microsoft.AspNetCore.Mvc.Routing.DefaultApiVersionRoutePolicy[1] MyCodeCamp> 请求匹配多个操作,导致歧义。匹配 Action : MyCodeCamp.Controllers.Speakers2Controller.Get(字符串, bool )(MyCodeCamp) MyCodeCamp> MyCodeCamp.Controllers.SpeakersController.Get(字符串, bool ) (MyCodeCamp) MyCodeCamp> 失败:Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] MyCodeCamp> 执行请求时发生未处理的异常。 MyCodeCamp> Microsoft.AspNetCore.Mvc.Internal.AmbigouslyActionException:多个操作 匹配。以下操作匹配路线数据并满足所有约束:

Controller Speakers2[ApiVersion("2.0")] 装饰,因此它的 Get(string, bool) 操作是版本 2.0,因此为什么版本控制无法区分它们?

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

启动.cs:

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

Controller :

  [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 混淆了。

我通过在 Speakers controller virtual 中执行 Get 操作来使其工作,然后 Speakers2 controller 中覆盖它作为不会被调用的占位符。我还必须将 [ApiVersion("2.0")] 仅应用于 GetWithCount action 而不是 controller >.

[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)

关于c# - Core 2.1 APIVersioning 操作歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54166770/

相关文章:

c# - 分析内存转储以查找泄漏

c# - MemoryStream 的烦恼

c# - DEBentityValidationException 不是 "cleared"

c# - CORS 不适用于路线

asp.net-core - Blazor Web 程序集、FIDO2 和身份服务器

c# - 从 Visual Studio SQL 项目创建用于测试的 LocalDB

asp.net - 如何使用 ASP.NET MVC Web API OData 链接到 Razor 中的 OData 集合

asp.net-web-api - WebApi 2.1 上的 log4net 使用 ExceptionLogger

azure - 如何从本地Visual Studio环境连接到azure sql而不存储连接字符串?

c# - Razor Pages - 使用多个提交按钮或多个表单处理分页