После некоторой дополнительной отладки я наконец понял, почему это не работает, поэтому я публикую решение для всех, кто столкнется с подобной проблемой. Проблема была в наследовании контроллера.
Я создал CustomBaseController (который я почему-то полностью игнорировал как проблемный) с некоторыми методами глобальной обработки исключений, наследование происходит следующим образом:
[ApiVersionNeutral]
[Route("api/[controller]")]
[ApiController]
CustomBaseController : Controller
и
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
ValuesController : CustomBaseController { // http method implementations}
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/values")]
[ApiController]
ValuesController : CustomBaseController { // updated http method implementations}
Механизм управления версиями не соответствовал атрибуту [ApiVersionNeutral]
, хотя для меня имело смысл, что базовый контроллер вообще не нужно менять. Более того, у меня была только основная маршрутизация в базовом контроллере
Таким образом, я получил сообщение об ошибке «Сопоставлено несколько действий».
Я также обнаружил, что контроллер версии 1 может наследовать маршрутизацию от базового контроллера, и у него не было причин иметь там маршрутизацию. Для всех последующих контроллеров маршрутизация должна быть:
[Route("api/v{version:apiVersion}/values")]
.
Рабочее решение вместе с первоначальной конфигурацией, указанной выше, выглядит следующим образом:
[Route("api/v{version:ApiVersion}/[controller]")]
[ApiController]
CustomBaseController: Controller {}
[ApiVersion("1.0")]
[ApiController]
ValuesController: CustomBaseController { //code }
[ApiVersion("2.0")]
[ApiController]
[Route("api/v{version:ApiVersion}/values")]
Values2Controller: CustomBaseController { //code }
[ApiVersion("3.0")]
[ApiController]
[Route("api/v{version:ApiVersion}/values")]
Values3Controller: CustomBaseController { //code }
Получение значений из следующих URL:
api/v1/values
api/v2/values
api/v3/values
Несмотря на то, что моя проблема была решена, я все еще не понимаю, почему [ApiVersionNeutral] может привести к тому, что маршрутизация не сможет правильно определять версии других контроллеров. Любое объяснение будет высоко оценено.
Спасибо @Matt Stannett за ваши комментарии, они привели меня в правильном направлении.