3

동사를 하나만 다른 쿼리 문자열로 사용하여 HttpGet 동사를 지원해야하지만 쿼리 문자열은 경로 템플릿에 포함될 수 없습니다. - 사실입니까?ASP.NET 코어, 쿼리 문자열을 템플릿으로 사용하는 Web API RouteAttribute

경로 템플릿은 매우 유사하며 사실 쿼리 문자열 만 다릅니다. ?이 경로 템플릿에 유효한 문자가 아닙니다으로

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

이 예외가 발생합니다. 이것을 어떻게 할 수 있습니까?

답변

4

나는보다 쉽고 간단한 솔루션을 알아 냈어. 나는 단순히 FromQuery 속성을 사용하고 템플릿을 단순하게 남겨두고있다. 나는 id 변수의 존재를 확인하고 적절하게 처리합니다.

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

복잡한 개체의 경우 [FromUri]를 사용할 수 있습니다. –

1
//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); 
} 
관련 문제