Solución:
El motor de ruta utiliza la misma secuencia a la que le agregas reglas. Una vez que obtenga la primera regla coincidente, dejará de verificar otras reglas y tomará esto para buscar controlador y acción.
Entonces, deberías:
-
Ponga sus reglas específicas por delante de sus reglas generales (como las predeterminadas), lo que significa usar
RouteTable.Routes.MapHttpRoute
para mapear “WithActionApi” primero, luego “DefaultApi”. -
Eliminar el
defaults: new { id = System.Web.Http.RouteParameter.Optional }
parámetro de su regla “WithActionApi” porque una vez que la identificación es opcional, una URL como “/ api / {part1} / {part2}” nunca entrará en “DefaultApi”. -
Agregue una acción con nombre a su “DefaultApi” para indicarle al motor de ruta qué acción debe ingresar. De lo contrario, una vez que tenga más de una acción en su controlador, el motor no sabrá cuál usar y arrojará “Se encontraron varias acciones que coinciden con la solicitud: …”. Luego, para que coincida con su método Get, use un atributo ActionNameAttribute.
Entonces tu ruta debería tener este aspecto:
// Map this rule first
RouteTable.Routes.MapRoute(
"WithActionApi",
"api/{controller}/{action}/{id}"
);
RouteTable.Routes.MapRoute(
"DefaultApi",
"api/{controller}/{id}",
new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);
Y tu controlador:
[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Puede resolver su problema con la ayuda de Enrutamiento de atributos
Controlador
[Route("api/category/{categoryId}")]
public IEnumerable<Order> GetCategoryId(int categoryId) { ... }
URI en jquery
api/category/1
Configuración de ruta
using System.Web.Http;
namespace WebApplication
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
// Other Web API configuration not shown.
}
}
}
y su enrutamiento predeterminado funciona como predeterminado enrutamiento basado en convenciones
Controlador
public string Get(int id)
{
return "object of id id";
}
URI en Jquery
/api/records/1
Configuración de ruta
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Consulte el artículo para obtener más información. Enrutamiento de atributos y enrutamiento basado en convenciones aquí y esto