6

He fijado un proyecto asp.net web API (funciona exactamente igual que un proyecto MVC) utilizando enrutamiento - por lo tanto tengo el siguienteAsp.net MVC/Web Api de enrutamiento: Necesidad de ruta un poco diferente

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

Así que todo funciona como yo quiero ... Ingresé api/Products/15 cuando llega a mi Controlador de Productos pasando 15 como ID.

Genial.

También tengo 2 controladores más, 1 llamado UploadsController y 1 llamado DownloadsController. Estos ofrecen cargas y descargas de (GET/PUT etc)

Ahora bien, no quiero que sean recogidos por la regla original (véase más arriba)

Pero lo que me gustaría es utilizar estas 2 urls a acceder a ellos

/api/Transporte/Cargas/15 /api/Transporte/Descargas/15

he pasado en el 15 como el ID, probablemente no pasaría en la vida real ... sólo su buen para la demostración :-)

ahora Transporte d oesn't existen por lo que podía hacer lo siguiente

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

que creo que las obras ...

pero el problema es que si lo hago

/api/Cargas/15 - esto sería también ser atrapado por la regla original que no quiero ..

Quiero que el controlador de cargas y descargas para acceder a través de los falsos "Transportes" y no sin los Transportes

¿Alguien puede ayudar?

Gracias de antemano

Respuesta

18

usted podría utilizar route constraints y definir rutas 2 del API en el siguiente orden:

// 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

gracias, eso es genial. – Martin

+0

upvotes múltiples si puedo :) –

Cuestiones relacionadas