Tengo la ruta predeterminada en Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Quería poder apuntar a una función específica, así que creé otra ruta:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Entonces, en mi controlador, tengo:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Llamar .../api/records/bycategoryid/5
me dará lo que quiero. Sin embargo, llamar .../api/records/1
me dará el error.
Se encontraron varias acciones que coinciden con la solicitud: ...
Entiendo por qué es así: las rutas solo definen qué URL son válidas, pero cuando se trata de coincidencia de funciones, ambas Get(int id)
y ByCategoryId(int id)
coincidencia api/{controller}/{id}
, que es lo que confunde el marco.
¿Qué debo hacer para que la ruta API predeterminada vuelva a funcionar y conservar la que tiene {action}
? Pensé en crear un controlador diferente llamado RecordByCategoryIdController
para que coincida con la ruta API predeterminada, por lo que solicitaría .../api/recordbycategoryid/5
. Sin embargo, encuentro que es una solución "sucia" (por lo tanto, insatisfactoria). He buscado respuestas sobre esto y no hay ningún tutorial sobre el uso de una ruta que {action}
incluso mencione este problema.