首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心2.1 APIVersioning行动模糊度

核心2.1 APIVersioning行动模糊度
EN

Stack Overflow用户
提问于 2019-01-13 07:02:31
回答 3查看 1K关注 0票数 2

我已经在我的Core2.1API项目中成功地设置了API版本控制。

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

1.12.0版本可以工作,但是1.0失败了,Get(string, bool)操作不明确。

ASP.NET核心网络服务器:

MyCodeCamp> fail: Microsoft.AspNetCore.Mvc.Routing.DefaultApiVersionRoutePolicy[1] MyCodeCamp> Request matched multiple actions resulting in ambiguity. Matching actions: MyCodeCamp.Controllers.Speakers2Controller.Get(string, bool) (MyCodeCamp) MyCodeCamp> MyCodeCamp.Controllers.SpeakersController.Get(string, bool) (MyCodeCamp) MyCodeCamp> fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] MyCodeCamp> An unhandled exception has occurred while executing the request. MyCodeCamp> Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

控制器Speakers2是用[ApiVersion("2.0")]装饰的,所以它的Get(string, bool)动作是2.0版本,那么为什么Versioning不能区分它们呢?

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

Startup.cs:

代码语言:javascript
复制
  services.AddApiVersioning(cfg =>
    { cfg.DefaultApiVersion = new ApiVersion(1, 1);
      cfg.AssumeDefaultVersionWhenUnspecified = true;
      cfg.ReportApiVersions = true;     });

管制员:

代码语言:javascript
复制
  [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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-13 18:02:46

显然,版本控制与多个Getxxx IActionResult混淆了。

我让它在Speakers controller virtual中运行,然后在Speakers2 controller中将其作为不被调用的占位符。我还必须只将[ApiVersion("2.0")]应用于GetWithCount action,而不是controller

代码语言:javascript
复制
[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)
票数 2
EN

Stack Overflow用户

发布于 2019-02-08 05:16:32

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

票数 0
EN

Stack Overflow用户

发布于 2021-08-24 10:17:35

找到了多个候选操作,但没有一个操作与请求的服务API版本“1”匹配。Soln:在操作方法上使用:>MapToApiVersion("1.0")属性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54166770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档