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

Posted

技术标签:

【中文标题】ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute【英文标题】:ASP.NET Core, Web API RouteAttribute with query string as template 【发布时间】:2016-08-16 14:57:52 【问题描述】:

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

路由模板非常相似,实际上它们只是查询字符串不同。

[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);
    

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您可以将 [FromUri] 用于复杂对象。【参考方案2】:
//eg GET api/symbols
//eg GET api/symbols?childrenOf=someGuid
[HttpGet("api/symbols")]
public Task<IEnumerable<Symbol>> Symbols(
    [FromServices] ISymbolService symbolService, 
    Guid? childrenOf = null)

    if (childredOf.HasValue) 
        return ValidChildren(childredOf.Value, symbolService);
    
    return symbolService.GetSymbolsAsync();


Task<IEnumerable<Symbol>> ValidChildren(
    Guid id, 
    ISymbolService symbolService)

    return symbolService.GetValidChildrenAsync(id);

【讨论】:

以上是关于ASP.NET Core,以查询字符串为模板的 Web API RouteAttribute的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET Core 将查询字符串参数转换为看起来像目录部分?

选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

在 ASP.NET Core 中将 Razor 视图渲染为字符串

使用将 net461 设置为唯一框架的 ASP.NET Core Web 应用程序 (.NET Core) 与使用 (.NET Framework) 模板之间的区别

Visual Studio 2019 ASP.NET Core API 项目模板损坏?

为 ASP.NET Core 5.0 - EF Core 5.0 Web App 配置 PostgreSQL 连接字符串以在 MS 或 Linux 云上运行?