Маршрутизация атрибутов Web API 2: AmbiguousMatchException: запрос соответствует нескольким конечным точкам - PullRequest
0 голосов
/ 23 апреля 2020

Привет ниже, мой сценарий

У меня есть PersonController с методом CreatePerson

[ApiVersion(ApiControllerVersion.Version1)]
    public class PersonController : BaseController
    {
        [HttpPost]
        [Route("/person")]
        [Produces("application/json")]
        [SwaggerResponse((int)HttpStatusCode.OK)]
        [SwaggerResponse((int)HttpStatusCode.InternalServerError, Type = typeof(ErrorServiceResponse))]
        [SwaggerResponse((int)HttpStatusCode.BadRequest, Type = typeof(ErrorServiceResponse))]
        [SwaggerOperation("POST: Create Person")]
        [ValidateModelState]
        public async Task<IActionResult> CreatePerson([FromBody][Required] CreatePersonRequest person)
        {
        }

        [HttpPut]
        [Route("/person")]
        [Produces("application/json")]
        [SwaggerResponse((int)HttpStatusCode.OK)]
        [SwaggerResponse((int)HttpStatusCode.InternalServerError, Type = typeof(ErrorServiceResponse))]
        [SwaggerResponse((int)HttpStatusCode.BadRequest, Type = typeof(ErrorServiceResponse))]
        [SwaggerOperation("POST: Change Person")]
        [ValidateModelState]
        public async Task<IActionResult> UpdatePerson([FromBody][Required] UpdatePersonRequest person)
        {
        }
    }

Я хотел создать другую версию этого API, созданную, как показано ниже, потому что мой маршрут создания изменен. Где я наследую PersonController, потому что я хочу, чтобы все методы из V1 и изменились от v2, кроме «CreatePerson»

[ApiVersion(ApiControllerVersion.Version2)]
    public class PersonControllerV2 : PersonController
    {
        [HttpPost]
        [Route("/persons")]
        [Produces("application/json")]
        [SwaggerResponse((int)HttpStatusCode.OK)]
        [SwaggerResponse((int)HttpStatusCode.InternalServerError, Type = typeof(ErrorServiceResponse))]
        [SwaggerResponse((int)HttpStatusCode.BadRequest, Type = typeof(ErrorServiceResponse))]
        [SwaggerOperation("POST: Create Person")]
        [ValidateModelState]
        public new async Task<IActionResult> CreatePerson([FromBody][Required] CreatePersonRequest person)
        {
        }
    }

Если я не изменю маршрут, я вижу VOST POST / person и V2 POST / person работает нормально, однако

, когда я изменяю свой маршрут V2 на "/ people" с "/ person" для CreatePerson в соответствии с моим требованием, тогда я получаю ошибку ниже при вызове V1 POST / person от swagger

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: запрос соответствует нескольким конечным точкам. Controllers.PersonControllerV2.CreatePerson Controllers.PersonController.CreatePerson

В этом случае мой

V1 swagger показывает

  • POST / person
  • PUT / человек

V2 чванство показывает

  • POST / человек
  • POST / человек
  • PUT / person

Есть идеи или предложения по решению этой проблемы?

1 Ответ

0 голосов
/ 29 апреля 2020

Причина в том, что вы не указали [ApiController] до [ApiVersion(ApiControllerVersion.Version1)] и [ApiVersion(ApiControllerVersion.Version2)].

Так что вы должны измениться так:

[ApiController] 
[ApiVersion(ApiControllerVersion.Version1)]
    public class PersonController : BaseController
    {...

[ApiController] 
[ApiVersion(ApiControllerVersion.Version2)]
    public class PersonControllerV2 : PersonController
    {...
...