2016-08-02 34 views
5

Więc jestem testowania niektórych moich routingu się z Postman i nie wydaje się uzyskać to wezwanie, aby przejść:Web API Parametry opcjonalne w środku z atrybutem routingu

API Function

[RoutePrefix("api/Employees")] 
public class CallsController : ApiController 
{ 
    [HttpGet] 
    [Route("{id:int?}/Calls/{callId:int?}")] 
    public async Task<ApiResponse<object>> GetCall(int? id = null, int? callId = null) 
    { 
     var testRetrieve = id; 
     var testRetrieve2 = callId; 

     throw new NotImplementedException(); 
    } 
} 

Postman kupna

http://localhost:61941/api/Employees/Calls NIE DZIAŁA

Błąd:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:61941/api/Employees/Calls'.", 
    "MessageDetail": "No action was found on the controller 'Employees' that matches the request." 
} 

http://localhost:61941/api/Employees/1/Calls WORKS

http://localhost:61941/api/Employees/1/Calls/1 WORKS

jakiś pomysł, dlaczego nie można użyć opcjonalnego między moim prefiks i niestandardowej trasie? Próbowałem połączyć je w jedną niestandardową trasę i to niczego nie zmienia, za każdym razem próbuję wykreślić identyfikator, który powoduje problemy.

Odpowiedz

6

opcjonalne parametry muszą być na końcu szablonu trasy. więc to, co próbujesz zrobić, nie jest możliwe.

Attribute routing: Optional URI Parameters and Default Values

należy albo zmienić swoją temaple trasa

[Route("Calls/{id:int?}/{callId:int?}")] 

lub utworzyć nową akcję

[RoutePrefix("api/Employees")] 
public class CallsController : ApiController { 

    //GET api/Employees/1/Calls 
    //GET api/Employees/1/Calls/1 
    [HttpGet] 
    [Route("{id:int}/Calls/{callId:int?}")] 
    public async Task<ApiResponse<object>> GetCall(int id, int? callId = null) { 
     var testRetrieve = id; 
     var testRetrieve2 = callId; 

     throw new NotImplementedException(); 
    } 

    //GET api/Employees/Calls 
    [HttpGet] 
    [Route("Calls")] 
    public async Task<ApiResponse<object>> GetAllCalls() { 
     throw new NotImplementedException(); 
    } 
} 
1

Właściwie nie musisz podać opcjonalny parametr w trasie

[Route("Calls")] 

lub trzeba zmienić trasę

[Route("Calls/{id:int?}/{callId:int?}")] 
public async Task<ApiResponse<object>> GetCall(int? id = null, int? callId = null) 
+0

Mimo, że działa jako funkcja indywidualne, szukam do hermetyzacji wszystkich 3 te potencjalne wywołania pod 1 funkcją, które, jeśli rozumiem opcjonalne rutowanie, powinno być możliwe. – tokyo0709

2

chciałbym zmienić trasę do:

[Route("Calls/{id:int?}/{callId:int?}")] 

i dodaj atrybut [FromUri] do swoich parametrów:

([FromUri]int? id = null, [FromUri]int? callId = null) 

Moja funkcja Test wygląda następująco:

[HttpGet] 
[Route("Calls/{id:int?}/{callId:int?}")] 
public async Task<IHttpActionResult> GetCall([FromUri]int? id = null, [FromUri]int? callId = null) 
{ 
    var test = string.Format("id: {0} callid: {1}", id, callId); 

    return Ok(test); 
} 

mogę powołać się go za pomocą:

https://localhost/WebApplication1/api/Employees/Calls 
https://localhost/WebApplication1/api/Employees/Calls?id=3 
https://localhost/WebApplication1/api/Employees/Calls?callid=2 
https://localhost/WebApplication1/api/Employees/Calls?id=3&callid=2