Saltar al contenido

Enrutamiento de API web: api / {controller} / {action} / {id} “disfunciones” api / {controller} / {id}

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:

  1. 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”.

  2. 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”.

  3. 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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *