[英]Core Web Api - Error: Action has more than one parameter bound from request body
[英]Error: Action has more than one parameter bound from request body
我在我的 ASP.Net MVC 項目的 Controller 中寫了一個新方法,並在下面出現錯誤。 我認為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活動
BeverageCapability容量
我可以找到建議檢查 nugets 的信息,但我所有的 Nugets 都是最新的。
該錯誤來自模型綁定,與 Swagger 無關( ApiExplorerSettings
屬性的存在對錯誤沒有影響)。
你有兩個復雜的參數。 即復雜類型
BeverageCapacityCampaign
BeverageCapacity
模型綁定的默認設置是綁定來自請求正文的復雜參數。 但是,每個動作只能從 body 綁定一個參數。
所以你需要要么
System.Web.Http.Description
ApiExplorerSettings
將忽略來自幫助頁面或其他任何內容(可能是大搖大擺的)的屬性操作......但您仍然會收到此異常 - 來自模型綁定級別的問題
對於我來說,在定義一個新的控制器時會自動添加這個先決條件。
我刪除了它並且它有效
[Route("api/[controller]")]
[Apicontroller] //remove this line
我的控制器有一些重構的代碼,其方法被標記為公共。 看起來將它們移出控制器或標記為私有可以解決此問題。 或者將討厭的方法歸因於[NonAction]
也可能是一個選擇,如asp.net Core mvc hide and exclude Web Api Controller Method
我收到錯誤“有多個指定的參數......”,因為在類的頂部提到了 [ApiController],然后從 APIController 繼承了類。
通過從 Controller 繼承類更正了問題。
[Authorize]
[Route("api/the")]
**[ApiController]**
public class TheController : **Controller**
我通過繼承 BaseController 而不是 ControllerBase 得到了這個錯誤。 這是另一個庫中的一個完全不相關的類,我記錯了名字。 例外對我來說是一個紅鯡魚。
我遇到了這個問題,但通過將我的方法聲明為私有來解決它。
就我而言,問題是在 controller 中我有不是端點的公共方法。 控制器的 ASP.NET 核心映射將所有公共方法視為端點並嘗試 map 請求 model 因為它使用反射。
另一種可能的解決方案是將復雜數據類型嵌套在元組中:
[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 正確識別案例並生成有效的客戶端代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.