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

ApiConvention response types- matching multiple Get methods

我的项目中有几个控制器,它们有多个 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: 'Method name 'Get' is ambiguous for convention type 'P.API.Conventions.PApiConventions'. More than one method found with the name 'Get'. Arg_ParamName_Name'

这与 Startup 中的 app.UseMvc() 相对应。 我了解发生了什么,但似乎无法处理逻辑以使其正确解析 get 方法。

我不是 Web API 约定方面的专家,但在各种测试中我注意到这些约定不会影响路由和模型绑定。所以你仍然需要明确指定 HttpMethod 属性为 actions

[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){}