我的项目中有几个控制器,它们有多个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方法。
我不是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){}