Проблема в том, что у вас есть 2 метода post, и API не знает, как определить / сгенерировать имя ресурса.
Что вам нужно сделать, это добавить настроенное имя ресурса с дублированным именем метода.
Итак, если мы возьмем, к примеру, ваш пример, вы можете добавить ресурс к тому, который выбрасывает исключение, и оставить другое, или дать им оба уникальное имя ресурса.
Например, что-то вроде [HttpPost("id")]
.
Чтобы подтвердить это, я сделал тестовый проект с вашим кодом, для этого я использовал swagger, и он потерпел неудачу. Теперь, когда я добавил id
к одному из методов сообщения, подобных этому:
[HttpPost("id")]
public IActionResult Post(int id, [FromBody]dynamic value)
{
return Ok(true);
}
[HttpPost]
public IActionResult Post([FromBody]dynamic value)
{
return Ok(true);
}
Затем он работает со следующим выводом:
Дополнение к основному ответу В своем коде вы разрешаете принимать параметр, добавляя int id
в свой метод
Post(int id, [FromBody]dynamic value)
Если вы действительно не хотите использовать Параметр, то вы можете передать вам настроенный объектный класс и сделать что-то вроде этого, не тестируя его:
Post([FromBody]MyCustomObjectClass data)
и вы MyCustomerObjectClass
:
class MyCustomObjectClass {
public int? Id { get; set; }
public dynamic Value { get; set; }
}
, чем вам не нужно 2 Методы записи, вы можете иметь только один, и Id может быть необязательным.
И только чтобы вас не смущать. Это плохо, что я использовал id в посте вроде [HttpPost("id")]
в качестве соглашения об именах, он не имеет отношения к параметру Id вашего метода. id
в данном случае это просто название ресурса, оно не влияет на действия. так что вы можете называть это тем, что когда-либо подходит вашим логикам c [HttpPost("post1")]
и [HttpPost("post2")]
.
Последний совет: хорошо использовать Dynami c для тестирования и быстрого запуска API. , но я бы всегда использовал объект типа stati c.
Я бы настоятельно рекомендовал взглянуть на this .