当POST方法有多个参数时,ApiExplorer无法确定ApiParameterSource

时间:2016-02-24 20:24:09

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

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

问题发生在ASP.NET Web API Help Page's HelpPageConfigurationExtensions.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如何确定源值。与此同时,我已经破解了帮助页面的课程来解决这个问题,但我想要一个更好的解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

在方法体中,您可以获得如下发布数据:postData。[参数名称]