2015-12-14 8 views
7

Ho un controller asp.net web api con 2 metodi GET. Uno accetta un parametro stringa e l'altro accetta un parametro int. Ho solo il percorso predefinito che viene impostato con web API in atto.È possibile avere 2 metodi GET con diversi tipi di parametri all'interno dello stesso controller web API?

 public HttpResponseMessage GetSearchResults(string searchTerm) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

     public HttpResponseMessage Get(int id) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

Ogni volta che passo un valore int nell'URL, il metodo GET che prende il parametro di stringa è chiamato. Il metodo GET che accetta il parametro int non viene mai chiamato.

È possibile avere 2 metodi GET con diversi tipi di parametri all'interno dello stesso controller?

-Edit- La domanda duplicata suggerita è diversa perché richiede circa 2 metodi con gli stessi identici tipi di parametri - sto chiedendo di tipi di parametri diversi.

risposta

14

Sì, è possibile. Fuori dalla scatola con la configurazione di default, quello che devi funzionare presuppone che tu stia passando lo searchTerm come parametro di stringa di query. Tuttavia, se si sta tentando di passarlo come parte dell'URL, come ad esempio /api/myurl/blah, il routing della convenzione predefinito tenterà di abbinarlo alla versione int del metodo e restituire un errore. Dovrai modificare la configurazione predefinita o usare Attribute Routing.

In generale, il routing MVC basato su convenzione è meno utile in WebApi, quindi di solito lo disabilito e utilizzo Attribute Routing.

Per attivare l'attributo di routing, aggiungere

config.MapHttpAttributeRoutes(); 

alla propria configurazione WebAPI.

Quindi è possibile marcare i vostri metodi, come tale

[HttpGet] 
[Route("api/myobject/")] 
public HttpResponseMessage GetSearchResults(string searchTerm) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

[HttpGet] 
[Route("api/myobject/{id:int}")] 
public HttpResponseMessage Get(int id) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

Ora, è possibile chiamare il primo metodo tramite

/api/myobject?searchTerm=blah 

e la seconda tramite

/api/myobject/1 

e shouldn si scontrano.

Tuttavia, se si vuole avere il searchTerm essere nell'URL invece dei parametri di query, è possibile modificare il percorso per

[Route("api/myobject/{searchTerm}")] 

Il api/myobject/{id:int} percorso cattura tutti gli ID e la api/myobject/{searchTerm} si cattura più qualunque altra cosa. Tuttavia, fai attenzione con questo come se l'URL non fosse codificato URL cose strane tendono ad accadere.

Non so esattamente quale sia la formattazione dell'URL che stai cercando, quindi quello che ho fornito sono solo semplici esempi. Lo link che ho postato in precedenza approfondisce maggiormente il routing degli attributi. Ti consente di creare percorsi più complessi rispetto al routing per convenzione che WebApi ha ereditato da MVC.

+0

Ottima spiegazione: il routing attribuito ha funzionato perfettamente! – Aaron

+0

Nessun problema. Sono contento che ci abbia aiutato. –