ASP.NET Core,Web API RouteAttribute以查询字符串作为模板

Dav*_*ine 5 routing asp.net-web-api asp.net-web-api2 asp.net-core asp.net-core-webapi

我需要创建一个ASP.NET Core, Web API支持多个HttpGet动词的唯一区别是查询字符串,但似乎查询字符串不能成为路由模板的一部分 - 是真的吗?

路径模板非常相似,实际上它们只有查询字符串不同.

[Authorize]
public class SymbolsController : Controller
{
    [
        HttpGet, 
        Route("api/symbols")
    ]
    public Task<IEnumerable<Symbol>> Symbols([FromServices] ISymbolService symbolService)
    {
        return symbolService.GetSymbolsAsync();
    }

    [
        HttpGet, 
        Route("api/symbols?{childrenOf=id}")
    ]
    public Task<IEnumerable<Symbol>> ValidChildren(
        [FromQuery] Guid id, 
        [FromServices] ISymbolService symbolService)
    {
        return symbolService.GetValidChildrenAsync(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会引发异常,因为?它不是路由模板中的有效字符.我怎样才能做到这一点?

Dav*_*ine 8

我想出了一个更简单、更直接的解决方案。我只是使用该FromQuery属性并让模板保持简单。我检查id变量的存在并相应地处理它。

[HttpGet, Route("api/symbols")]
public Task<IEnumerable<Symbol>> Symbols(
    [FromQuery] Guid id, 
    [FromServices] ISymbolService symbolService) => 
    id == default
        ? symbolService.GetSymbolsAsync()
        : symbolService.GetValidChildrenAsync(id);
Run Code Online (Sandbox Code Playgroud)