Ошибка: действие имеет более одного параметра, связанного с телом запроса - PullRequest
0 голосов
/ 19 декабря 2018

Я написал новый метод в мой контроллер моего проекта ASP.Net MVC и получил ошибку ниже.Я думаю, что InvalidOperationException приходит с Swagger.Я пометил его как «проигнорированный Api», надеясь, что он пропустит метод, но ошибка все еще там:

[ApiExplorerSettings(IgnoreApi = true)]
public decimal CalculatePriceWithCampaign(
       BeverageCapacityCampaign campaign, 
       BeverageCapacity capacity,
       int count = 1)
{
    switch (campaign.DiscountType)
    {
        case DiscountType.Fixed:
            return (capacity.CapacityPrice - campaign.DiscountValue) * count;
        case DiscountType.Percentage:
            return (capacity.CapacityPrice * count) * campaign.DiscountValue;
        default:
            return capacity.CapacityPrice;
    }
}

Но при запуске я получаю эту ошибку:

Произошло необработанное исключениепри обработке запроса.

InvalidOperationException: Действие 'Gorilla.WebApi.Source.Controller.Campaigns.BeverageCapacityCampaignController.CalculatePriceWithCampaign (Gorilla.WebApi)' имеет более одного параметра, который был указан или выведен как связанный с телом запроса.Только один параметр на действие может быть связан с телом.Проверьте следующие параметры и используйте «FromQueryAttribute» для указания границы из запроса, «FromRouteAttribute» для указания границы из маршрута и «FromBodyAttribute» для параметров, которые должны быть связаны с телом:Кампания BeverageCapacityCampaignЕмкость BeverageCapacity

Информация, которую я мог бы найти, предлагала проверить нюгеты, но все мои нюгеты обновлены.

Ответы [ 3 ]

0 голосов
/ 15 июля 2019

Другое возможное решение - вложить сложные типы данных в кортеж:

[ApiExplorerSettings(IgnoreApi = true)]
public decimal CalculatePriceWithCampaign((BeverageCapacityCampaign campaign, BeverageCapacity capacity) data, int count = 1)
{
    switch (data.campaign.DiscountType)
    {
        case DiscountType.Fixed:
            return (data.capacity.CapacityPrice - data.campaign.DiscountValue) * count;
        case DiscountType.Percentage:
            return (data.capacity.CapacityPrice * count) * data.campaign.DiscountValue;
        default:
            return data.capacity.CapacityPrice;
    }
}

Однако NSwag (Swagger) не может автоматически анализировать этот случай, потому что недопустимый пример получаетгенерироваться.NSwagStudio правильно распознает регистр и генерирует действительный код клиента.

0 голосов
/ 30 июля 2019

Я получил ошибку "имеет более одного параметра, который был указан ..." за упоминание [ApiController] поверх класса и затем наследование класса от APIController.

Исправлена ​​ошибка, наследовавшая класс отКонтроллер.

[Authorize]
[Route("api/the")]
**[ApiController]**
public class TheController : **Controller**
0 голосов
/ 19 декабря 2018

Ошибка происходит из-за привязки модели и не связана с Swagger (наличие атрибута ApiExplorerSettings не влияет на ошибку).

У вас есть два сложных параметра.т. е. сложных типов

BeverageCapacityCampaign 
BeverageCapacity 

по умолчанию для Привязка модели предназначена для привязки комплексных параметров из тела запроса.Однако только один параметр на действие может быть связан с телом .

Так что вам нужно либо

  1. Объединить их в один класс, который просто упаковывает / хранит оба параметра как свойства - и связывает их с телом (как один объект)
  2. Решите, какую привязку выполнить из тела, а какую из маршрута или запроса, и добавьте атрибуты [FromRoute] или [FromQuery] к одному и [FromBody] к другому.

ApiExplorerSettings из System.Web.Http.Description будет игнорировать атрибутивное действие со страницы справки или что-то еще (возможно, чванство) ... но вы все равно получите это исключение - из проблем на уровне моделиСвязывание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...