簡體   English   中英

錯誤:操作具有多個從請求正文綁定的參數

[英]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 綁定一個參數

所以你需要要么

  1. 將它們組合成一個類,該類僅將兩個參數包裝/保存為屬性 - 並將它們從主體中綁定(作為一個對象)
  2. 決定從正文綁定哪個,從路由或查詢綁定哪個,並將屬性 [FromRoute] 或 [FromQuery] 添加到一個,將 [FromBody] 添加到另一個。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM