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.
fuente
id
es opcional, entonces la URL como/api/{part1}/{part2}
aún puede entrar en laDefaultApi
ruta si no se encuentra una acción coincidente para laWithActionApi
ruta. Por favor corrígeme si estoy equivocado.Puede resolver su problema con la ayuda del enrutamiento de atributos
Controlador
URI en jquery
Configuración de ruta
y su enrutamiento predeterminado funciona como enrutamiento predeterminado basado en convenciones
Controlador
URI en Jquery
Configuración de ruta
Consulte el artículo para obtener más información. Enrutamiento de atributos y enrutamiento basado en convenciones aquí y esto
fuente
Prueba esto.
fuente
La posible razón también puede ser que no haya heredado Controller de ApiController. Me pasó un tiempo para entender lo mismo.
fuente
Para diferenciar las rutas, intente agregar una restricción de que id debe ser numérico:
fuente