【问题标题】:ApiExplorer can't determine ApiParameterSource when a POST method has multiple parameters当 POST 方法有多个参数时,ApiExplorer 无法确定 ApiParameterSource
【发布时间】:2016-03-18 16:21:00
【问题描述】:

我有一个 POST 方法,由于应用于该方法的 custom HttpParameterBinding,它接受 多个 参数。 (如果没有自定义绑定,POST 方法只能接受 1 个参数。)问题是 ApiExplorer 无法确定这些参数的 ApiParameterSource。源应该是FromBody,而是Unknown。只有当有多个参数时才会发生这种情况。即使使用相同的参数绑定,如果只有 1 个参数,一切正常。

问题发生在ASP.NET Web API Help Page'sHelpPageConfigurationExtensions.GenerateRequestModelDescription()方法中:

    private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator)
    {
        ApiDescription apiDescription = apiModel.ApiDescription;
        foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions)
        {
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // In the line below, apiParameter.Source = Unknown, not FromBody
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            if (apiParameter.Source == ApiParameterSource.FromBody)
            {
                ...
            }
        }
    }

(需要明确的是,Source 属性由框架的 ApiExplorer 类确定,而不是在帮助页面区域中。)

我的 API 方法应用了自定义 HttpParameterBinding,如下所示,参数显式标记为 FromBody

[HttpPost, SimplePostVariableParameterBinding]
public SomeObject GetSomeObject([FromBody]Object2 obj2, [FromBody]Object3 obj3) {
    ...
}

我还尝试将参数绑定的 WillReadBody 属性设置为 true 以防万一有效果,但不幸的是它没有。 (它破坏了我的自定义绑定,所以我取消了更改。)

我试图了解发生了什么,或者只是为了更好地了解 ApiExplorer 如何确定源值。与此同时,我已经破解了帮助页面的课程来解决这个问题,但我想要一个更好的解决方案。

【问题讨论】:

    标签: .net asp.net-web-api


    【解决方案1】:

    如果你想在你的方法中使用多个参数,你必须通过查询字符串传递数据。否则可以使用以下方式:

    [HttpPost]
    public SomeObject GetSomeObject([FromBody] dynamic postData) {
        ...
    }
    

    在方法体中,您可以通过以下方式获取帖子数据:postData.[参数名称]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2020-03-21
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多