2

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

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

版本1.12.0工作,但因操作1.0不明确而失败Get(string, bool)

ASP.NET Core Web 服务器:

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(由于版本冲突,无法安装更高版本)

启动.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)
4

3 回答 3

2

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

我通过在 the 中进行Get操作,Speakers controller virtual然后overriding将其Speakers2 controller作为不会被调用的占位符来使其工作。我还必须将[ApiVersion("2.0")]only 应用于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)
于 2019-01-13T18:02:46.220 回答
0

您之前的实现不起作用的原因是因为并且不是[ApiVersion]继承[MapToApiVersion]的。这似乎违反直觉,但如果是这样,那么每个子类都会不断积累 API 版本。在第二个实现中,您没有覆盖原始版本,因此它隐含地变成了控制器指定的内容。这就是您看到重复项的原因,因为它现在与.Get2.0GetWithCount

于 2019-02-08T05:16:32.177 回答
0

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

于 2021-08-24T10:17:35.610 回答