ApiConvention响应类型 - 匹配多个Get方法

问题描述 投票:0回答:1

我的项目中有几个控制器,它们有多个Get方法:

public async Task<ActionResult<IEnumerable<DModel>>> Get(){}
public async Task<ActionResult<DModel>> Get(int id){}

我正在尝试创建一个与这些匹配的约定但依赖于参数 - 所以它可以区分它们。到目前为止,我有:

        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
        [ProducesDefaultResponseType]
        [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
        public static void Get()
        {
        }

        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
        [ProducesDefaultResponseType]
        public static void Get(
            [ApiConventionNameMatch(ApiConventionNameMatchBehavior.Prefix)]
            int id)
        {
        }

这似乎不起作用,当我尝试启动API时出现错误:

System.ArgumentException:'方法名'Get'对于约定类型'P.API.Conventions.PApiConventions'是不明确的。找到了多个名为'Get'的方法。 Arg_ParamName_Name”

这显示了Startup中的app.UseMvc()。我理解发生了什么,但似乎无法正常工作以使其正确解析get方法。

api asp.net-core asp.net-core-mvc asp.net-core-2.1 conventions
1个回答
1
投票

我不是Web API约定的专家,但在各种测试中,我注意到这些约定不会影响路由和模型绑定。因此,您仍需要为操作明确指定HttpMethod属性

[HttpGet]
public async Task<ActionResult<IEnumerable<DModel>>> Get(){}

//parameter name must match string inside curly braces
//if you leave {id} and update parameter name to idName
//(which matches prefix name convention)
//model binder won't bind value to parameter
//although tools that are using api conventions still will properly read controller info
[HttpGet("{id}")]
public async Task<ActionResult<DModel>> Get(int id){}
© www.soinside.com 2019 - 2024. All rights reserved.