Asp.net core 如何使用相同HTTP谓词(和查询参数)的多个控制器方法配置模型绑定?
很明显,我在试图让我的RESTAPI端点为这三个用例进行路由时犯了一些错误。Asp.net core 如何使用相同HTTP谓词(和查询参数)的多个控制器方法配置模型绑定?,asp.net-core,Asp.net Core,很明显,我在试图让我的RESTAPI端点为这三个用例进行路由时犯了一些错误。 我得到一个500,如下所示: The request matched multiple endpoints. Matches: Abc.FooBar.Controllers.FooController.GetByBar (Abc.FooBar) Abc.FooBar.Controllers.FooController.Get (Abc.FooBar) Abc.FooBar.Controllers.FooContro
我得到一个500,如下所示:
The request matched multiple endpoints. Matches:
Abc.FooBar.Controllers.FooController.GetByBar (Abc.FooBar)
Abc.FooBar.Controllers.FooController.Get (Abc.FooBar)
Abc.FooBar.Controllers.FooController.GetOnlyActive (Abc.FooBar)
我正在尝试允许以下功能:
[路由(“api/[控制器]”)]
[ApiController]
公共类FooController:ControllerBase
{
[HttpGet]
[产品响应类型(StatusCodes.Status200OK)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共异步任务Get()
{
//
}
[HttpGet]
[产品响应类型(StatusCodes.Status200OK)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共异步任务GetOnlyActive([FromQuery(Name=“onlyActive”)]bool onlyActive)
{
//
}
[HttpGet]
[产品响应类型(StatusCodes.Status200OK)]
[产品响应类型(StatusCodes.Status400BadRequest)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共异步任务GetByBar([FromQuery(Name=“bar”)]Guid栏)
{
//
}
}
您是否考虑过使用带有可选参数的单一方法,然后在其中应用您的逻辑:
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<IEnumerable<Foo>>> GetOnlyActive([FromQuery] bool onlyActive = false, [FromQuery] Guid? bar = null)
{
//
}
[HttpGet]
[产品响应类型(StatusCodes.Status200OK)]
[产品响应类型(StatusCodes.Status400BadRequest)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共异步任务GetOnlyActive([FromQuery]bool onlyActive=false,[FromQuery]Guid?bar=null)
{
//
}
当然可以。我最初有三合一方法中的两种。我可以加上第三个,特别是如果我想不出来的话。但是……据我所知,通过HttpGet属性、Route属性和FromX属性中的模板,我应该能够指出我希望MVC路由到哪种方法。对于这些用例,no?查询参数通常不定义路由。如果希望它们成为路由的一部分,可以使用类似于[route({onlyActive}]
和[route({bar}]
让他们使用api/Foo/true/
和api/Foo/391171fe-ccaa-4474-947b-b78c0dc6344e访问它们看看这个:-它可以做你想做的事。谢谢!IActionConstraint。因此,总而言之,实际上不可能针对同一个动词以本机方式路由多个动作,而这些动作只随查询参数的变化而变化。r通过一个公共控制器方法(如您的示例所述)输出所有操作,或者使用IActionConstraint和一点自定义代码来确定要跨多个方法执行的行为