6

Ho installato un progetto asp.net web api (funziona esattamente come un progetto Mvc) utilizzando il routing - quindi ho il seguenteAsp.net MVC/Web Api Routing: necessità di instradare un po 'diverso

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Quindi tutto funziona nel modo in cui lo voglio .... Io inserisco api/Prodotti/15 esso arriva nei miei prodotti Controller passando 15 come id.

Grande.

Ho anche 2 controller in più, 1 chiamato UploadsController e 1 chiamato DownloadController. Questi offrono upload e download (GET/PUT ecc)

Ora io non voglio loro di essere raccolti dalla regola originale (vedi sopra)

Ma quello che vorrei è quello di utilizzare questi 2 URL per accedervi

/api/Trasporti/uploads/15 /api/Trasporti/Download/15

ho passato in 15 come ID, probabilmente non sarebbe accaduto nella vita reale ... solo il suo bene per dimostrazione :-)

Ora Trasporto d oesn't esistono così ho potuto effettuare le seguenti operazioni

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/Transports/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

che credo opere ...

ma il problema è che se lo faccio

/api/uploads/15 - anche questo sarebbe essere catturati dalla regola originale che non voglio ..

voglio il controller upload e download a cui accedere attraverso i finti "Trasporti" e non senza i trasporti

Qualcuno può aiutarmi?

Grazie in anticipo

risposta

18

Si potrebbe usare route constraints e la definizione di percorsi 2 API nel seguente ordine:

// matches /api/transports/downloads/id or /api/transports/uploads/id only 
// and no other possible controller 
routes.MapHttpRoute(
    name: "API Transport", 
    routeTemplate: "api/transports/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { controller = "uploads|downloads" } 
); 

// matches anything in the form /api/{controller}/id where {controller} 
// could be anythnig different than "downloads" or "uploads" because we don't 
// want to allow the following urls: /api/downloads/id and /api/uploads/id 
routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { controller = @"^((?!(downloads|uploads)).)*$" } 
); 
+0

grazie, thats grande. – Martin

+0

più upvotes se posso :) –

Problemi correlati