Enrutamiento de la API web: api / {controller} / {action} / {id} “disfunciones” api / {controller} / {id}
Tengo la ruta por defecto 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" };
}
Vocación.../api/records/bycategoryid/5
me dara lo que quiero Sin embargo, llamando.../api/records/1
me dará el error
Se encontraron múltiples acciones que coinciden con la solicitud: ...
Entiendo por qué es eso: las rutas solo definen qué URL son válidas, pero cuando se trata de la coincidencia de funciones, ambasGet(int id)
yByCategoryId(int id)
partidoapi/{controller}/{id}
, Que es queconfunde el marco.
¿Qué debo hacer para que la ruta API predeterminada funcione de nuevo y mantener la ruta con la API?{action}
? Pensé en crear un controlador diferente llamadoRecordByCategoryIdController
para que coincida con la ruta API predeterminada, para la que solicitaría.../api/recordbycategoryid/5
. Sin embargo, me parece que es una solución "sucia" (por lo tanto insatisfactoria). He buscado respuestas sobre esto y no hay tutorial sobre cómo usar una ruta con{action}
Incluso menciona este problema.