Asp.net-Web-Api

ASP.NET Core,以查詢字元串為模板的 Web API RouteAttribute

  • May 15, 2020

我需要創建一個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);
}

引用自:https://stackoverflow.com/questions/38978247