Asp.net core 如何使用相同HTTP谓词(和查询参数)的多个控制器方法配置模型绑定?

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

很明显,我在试图让我的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.FooController.GetOnlyActive (Abc.FooBar)
我正在尝试允许以下功能:

  • 获取api/foo/(返回所有foo)
  • GET api/foo?onlyActive=false(返回所有foo,即使是非活动的)
  • 获取api/foo?bar=123。。。(返回条数等于123的所有foo…)
  • 所以我用两个控制器方法尝试了这一点,然后是更详细的三个,但它似乎无法获取我的属性来指示它匹配这些查询参数。有什么想法吗

    [路由(“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和一点自定义代码来确定要跨多个方法执行的行为