2015-06-24 14 views
8

È possibile personalizzare il meccanismo di routing dell'API Web ASP.NET per instradare tutte le richieste all'API a un metodo di controller?Instradare tutte le richieste API Web a un metodo di controller

Se arriva una richiesta per

www.mysite.com/api/products/ 

o

www.mysite.com/api/otherResource/7 

Tutti sarebbero stati indirizzati al mio metodo di SuperDuperController Get()?

+0

Potresti essere interessato a http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection –

risposta

1

Non so perché si vorrebbe fare questo e certamente non consiglierei di instradare tutto attraverso un controller, tuttavia si potrebbe ottenere questo come segue. Supponendo che si sta sempre e solo intenzione di avere una risorsa con un id opzionale tue chiamate, aggiungere questo al vostro WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{resource}/{id}", 
      defaults: new { controller = "SuperDuper", id = RouteParameter.Optional } 
     ); 
    } 
} 

quindi definire il metodo di controllo come segue:

public class SuperDuperController : ApiController 
{ 
    public IHttpActionResult Get(string resource, int? id = null) 
    { 
     return Ok(); 
    } 
} 

Si avrebbe bisogno di decidere su un appropriato IHttpActionResult da restituire per ogni diverso tipo di risorsa.

alternativa mediante l'attributo di routing, garantire che config.MapHttpAttributeRoutes() è presente nel vostro WebApiConfig e aggiungere i seguenti attributi per il metodo di controllo:

[RoutePrefix("api")] 
public class SuperDuperController : ApiController 
{ 
    [Route("{resource}/{id?}")] 
    public IHttpActionResult Get(string resource, int? id = null) 
    { 
     return Ok(); 
    } 
} 
5

mi sono imbattuto in un caso in cui avevo bisogno di fare questo. (Web API 2)

Ho iniziato a creare custom IHttpControllerSelector e IHttpActionSelector s. Tuttavia, era un po 'oscuro. Quindi alla fine ho optato per questa semplice implementazione. Tutto quello che devi fare è impostare un percorso con caratteri jolly. Esempio:

public class SuperDuperController : ApiController 
{ 
    [Route("api/{*url}")] 
    public HttpResponseMessage Get() 
    { 
     // url information 
     Request.RequestUri 
     // route values, including "url" 
     Request.GetRouteData().Values 
    } 
} 

Qualsiasi richiesta GET che inizi con "api /" verrà instradata al metodo precedente. Ciò include gli URL sopra menzionati nella tua domanda. Dovrai estrarre da te le informazioni dalla Richiesta o dagli oggetti contestuali poiché ciò aggira il valore del percorso automatico e l'analisi del modello.

La cosa buona è che è possibile utilizzare anche altri controller (a condizione che i percorsi non inizino con "api /").