Solución:
Puede tener varias acciones en un solo controlador.
Para eso tienes que hacer las siguientes dos cosas.
-
Primero decora acciones con
ActionName
atributo como[ActionName("route")] public class VTRoutingController : ApiController { [ActionName("route")] public MyResult PostRoute(MyRequestTemplate routingRequestTemplate) { return null; } [ActionName("tspRoute")] public MyResult PostTSPRoute(MyRequestTemplate routingRequestTemplate) { return null; } }
-
En segundo lugar, defina las siguientes rutas en
WebApiConfig
expediente.// Controller Only // To handle routes like `/api/VTRouting` config.Routes.MapHttpRoute( name: "ControllerOnly", routeTemplate: "api/{controller}" ); // Controller with ID // To handle routes like `/api/VTRouting/1` config.Routes.MapHttpRoute( name: "ControllerAndId", routeTemplate: "api/{controller}/{id}", defaults: null, constraints: new { id = @"^d+$" } // Only integers ); // Controllers with Actions // To handle routes like `/api/VTRouting/route` config.Routes.MapHttpRoute( name: "ControllerAndAction", routeTemplate: "api/{controller}/{action}" );
Una solución mucho mejor a su problema sería utilizar Route
que le permite especificar la ruta en el método por anotación:
[RoutePrefix("api/VTRouting")]
public class VTRoutingController : ApiController
{
[HttpPost]
[Route("Route")]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
[Route("TSPRoute")]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
usar:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ya no es un enfoque RESTful, pero ahora puede llamar a sus acciones por su nombre (en lugar de dejar que la API web determine automáticamente una según el verbo) de esta manera:
[POST] /api/VTRouting/TSPRoute
[POST] /api/VTRouting/Route
Contrariamente a la creencia popular, este enfoque no tiene nada de malo y no está abusando de la API web. Aún puede aprovechar todas las increíbles características de la API web (delegar controladores, negociación de contenido, formateadores de tipos de medios, etc.); simplemente abandone el enfoque RESTful.