Ошибка Action has more than one parameter that was specified or inferred as bound from request body

301
29 декабря 2019, 01:00

Есть такая странная ошибка при добавлении api контроллера в работающий проект: собирается, но при старте проекта выдаёт вместо индексной страницы сайта ошибку:

An unhandled exception occurred while processing the request.

InvalidOperationException: Action 'WebApp.Areas.Admin.Controllers.CityApiController.All (WebApp)' has more than one parameter that was specified or inferred as bound from request body. Only one parameter per action may be bound from body.

Inspect the following parameters, and use 'FromQueryAttribute' to specify bound from query, 'FromRouteAttribute' to specify bound from route, and 'FromBodyAttribute' for parameters to be bound from body: Query query CancellationToken cancellationToken

Microsoft.AspNetCore.Mvc.Internal.ApiBehaviorApplicationModelProvider.InferParameterBindingSources(ActionModel actionModel)

Контроллер совершенно рядовой, у меня в другом проекте практически такой же работает без проблем:

public class CityApiController : AdminApiControllerBase
{
    public CityApiController(IMediator mediator)
        : base(mediator)
    {
    }
    [HttpPost]
    public async Task<object> All(Cities.List.Query query, CancellationToken cancellationToken)
    {
        var result = await this.Mediator.Send(query, cancellationToken);
        return result;
    }
}
[ApiController]
[Route("api/[controller]/[action]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class AdminApiControllerBase : Controller
{
    public AdminApiControllerBase(IMediator mediator)
    {
        this.Mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
    }
    protected readonly IMediator Mediator;
}

Что это может быть такое? Хочется понять и разобраться. На новичковую ошибку не похоже.

Answer 1

Нашёл любопытный баг на гитхабе: ApiControllerAttribute incorrectly infers CancellationToken parameter as FromBody

В двух словах: поведение для FromBody разнится для 2.0 и 2.1 поэтому необходимо явно выставлять режим совместимости:

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Проект, который не запускался, был как раз проектом 2.0, многократно переделанном и потом переведённом на 2.1

READ ALSO
Программирование USB -&gt; COM порта на C++

Программирование USB -> COM порта на C++

Собираюсь подключить несколько моторчиков, датчиков ,светодиодовНо чтобы все это управлялось напрямую с ноута (без отдельного железа)

123
Отрицательное число в массиве byte

Отрицательное число в массиве byte

Подскажите пожалуйста, создаю байт массив, возникает ошибка на элемент -35

128
Применение Unity в Windows Forms

Применение Unity в Windows Forms

У меня есть допустим программа написанная на c#, и я хочу, чтобы например в интерфейсе программы было подокно которое должно быть уровнем Unity

118
Подключение к БД Mysql, получение данных

Подключение к БД Mysql, получение данных

Как можно осуществить подключение к базе данных Mysql и осуществить запросы? К примеру в PHP я подключаюсь так

127