我在ASP.Net MVC项目的控制器中写了一个新方法,并在下面出现错误。我认为InvalidOperationException
来自Swagger。我将其标记为“ ignored 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广告系列
饮料容量
我可以找到建议检查nuget的信息,但是我所有的Nuget都是最新的。
答案 0 :(得分:4)
该错误来自模型绑定,与Swagger无关(ApiExplorerSettings
属性的存在对错误没有影响。)
您有两个复杂的参数。即复杂类型
BeverageCapacityCampaign
BeverageCapacity
模型绑定的默认是从请求正文中绑定复杂参数。但是,每个动作只能绑定一个参数。
因此您需要
ApiExplorerSettings
中的 System.Web.Http.Description
将忽略帮助页面中的归因动作,或其他任何原因(可能是大招)...但是您仍然会遇到此异常-来自模型绑定级别的问题< / p>
答案 1 :(得分:2)
我的控制器有一些重构的代码,其方法被标记为public。看起来将它们移出控制器或标记为私有都可以解决此问题。或如asp.net Core mvc hide and exclude Web Api Controller Method
所述,将讨厌的方法归因于[NonAction]
也可能是一个选择。
答案 2 :(得分:1)
对我来说,在定义新控制器时会自动添加此先决条件。
我删除了它,而且有效
[Route("api/[controller]")]
[Apicontroller] //remove this line
答案 3 :(得分:0)
另一种可能的解决方案是将复杂的数据类型嵌套在元组中:
[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可以正确识别情况并生成有效的客户端代码。
答案 4 :(得分:0)
由于在类顶部提到了[ApiController],然后从APIController继承了类,因此收到错误消息“具有多个指定的参数...”。
通过从Controller继承类来解决问题。
[Authorize]
[Route("api/the")]
**[ApiController]**
public class TheController : **Controller**
答案 5 :(得分:0)
我是从BaseController而不是ControllerBase继承而得到此错误的。这是另一个库中的一个完全不相关的类,我记错了名字。对我来说是个例外。