2 votes

Core 2.1 APIVersioning Ambiguïté de l'action

J'ai configuré avec succès le versionnement de l'API dans mon projet d'API Core 2.1.

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

Versions 1.1 y 2.0 travailler mais 1.0 échoue en raison d'une ambiguïté sur le Get(string, bool) Actions.

ASP.NET Core Serveur 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:

Contrôleur Speakers2 est décoré de [ApiVersion("2.0")] Il s'agit donc Get(string, bool) L'action est la version 2.0, alors pourquoi l'action ne peut-elle pas être mise en œuvre ? Versioning les différencier ?

Microsoft.AspNetCore.Mvc.Versioning 3.0.0 (impossible d'installer une version supérieure en raison de conflits de versions)

Startup.cs :

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

Contrôleurs :

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

2voto

Joe Points 1945

Apparemment, les versions sont confondues avec les multiples Getxxx IActionResult s.

J'ai réussi à le faire fonctionner en rendant le Get l'action dans le Speakers controller virtual y luego overriding dans le Speakers2 controller en tant que placeholder qui ne sera pas appelé. J'ai également dû appliquer la méthode [ApiVersion("2.0")] uniquement au GetWithCount action et non le 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)

0voto

Chris Martinez Points 335

La raison pour laquelle votre précédente mise en œuvre n'a pas fonctionné est la suivante [ApiVersion] y [MapToApiVersion] sont pas hérité. Cela peut sembler contre-intuitif, mais si c'était le cas, chaque sous-classe continuerait à accumuler des versions d'API. Dans la deuxième implémentation, vous n'avez pas surchargé la version originale de Get Il est donc devenu implicitement 2.0 comme spécifié par le contrôleur. C'est la raison pour laquelle vous voyiez des doublons, car il y a maintenant une ambiguïté avec l'option GetWithCount .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X