Типы ответов ApiConvention, соответствующие нескольким методам Get - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть несколько контроллеров в моем проекте, которые имеют несколько методов Get:

public async Task<ActionResult<IEnumerable<DModel>>> Get(){}
public async Task<ActionResult<DModel>> Get(int id){}

Я пытаюсь создать соглашение, которое соответствует этим, но зависит от параметра - так, чтобы оно могло отличить.Пока у меня есть:

        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
        [ProducesDefaultResponseType]
        [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
        public static void Get()
        {
        }

        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
        [ProducesDefaultResponseType]
        public static void Get(
            [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
            int id)
        {
        }

Это не похоже на работу, и я получаю сообщение об ошибке при попытке запустить API:

System.ArgumentException: 'Имя метода«Get» является неоднозначным для типа соглашения «P.API.Conventions.PApiConventions».Найдено более одного метода с именем «Get».Arg_ParamName_Name '

Это показывает против app.UseMvc () при запуске.Я понимаю, что происходит, но не могу работать с логикой, чтобы заставить его правильно разрешать методы get.

1 Ответ

0 голосов
/ 22 февраля 2019

Я не эксперт в соглашениях Web API, но во время различных тестов я заметил, что соглашения не влияют на маршрутизацию и привязку модели.Поэтому вам все равно нужно явно указать атрибут HttpMethod для действий

[HttpGet]
public async Task<ActionResult<IEnumerable<DModel>>> Get(){}

//parameter name must match string inside curly braces
//if you leave {id} and update parameter name to idName
//(which matches prefix name convention)
//model binder won't bind value to parameter
//although tools that are using api conventions still will properly read controller info
[HttpGet("{id}")]
public async Task<ActionResult<DModel>> Get(int id){}
...