Asp.net-Web-Api
ASP.NET Core,以查詢字元串為模板的 Web API RouteAttribute
我需要創建一個
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); } }這會引發異常,因為
?不是路由模板中的有效字元。我怎樣才能做到這一點?
我想出了一個更簡單、更直接的解決方案。我只是使用
FromQuery屬性並讓模板保持簡單。我檢查id變數的存在並相應地處理它。[HttpGet, Route("api/symbols")] public Task<IEnumerable<Symbol>> Symbols( [FromQuery] Guid id, [FromServices] ISymbolService symbolService) => id == default ? symbolService.GetSymbolsAsync() : symbolService.GetValidChildrenAsync(id);
//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); }