Saltar al contenido

Múltiples tipos de controlador con la misma ruta prefix API web ASP.NET

Hacemos una revisión completa cada una de las reseñas de nuestro espacio con el objetivo de mostrarte siempre la información certera y actual.

Solución:

Web API (1.x-2.x) no admite múltiples attribute rutas con la misma ruta en diferentes controladores. El resultado es un 404, porque toda la ruta coincide con más de un controlador y, en ese momento, Web API considerará que el resultado es ambiguo.

Tenga en cuenta que MVC Core admite esta nota de escenario: MVC Core sirve como MVC y API web.

Si elige usar Web API 2.11 (o posterior), puede crear una restricción de ruta para el método http por controlador y usarla en lugar del atributo de ruta integrado. El siguiente ejemplo muestra que puede usar RoutePrefix o directamente Rutas (como la respuesta de kmacdonald).

using System.Collections.Generic;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Routing;

public class BooksWriteController : ApiController

    [PostRoute("api/Books")]
    public void Post()  


[RoutePrefix("api/books")]
public class BooksReadController : ApiController

    [GetRoute]
    public void Get()  

    [GetRoute("id:int")]
    public void Get(int id)  

Estas dos clases simplifican el uso de la ruta de restricción attribute

class GetRouteAttribute : MethodConstraintedRouteAttribute

    public GetRouteAttribute(string template) : base(template ?? "", HttpMethod.Get)  


class PostRouteAttribute : MethodConstraintedRouteAttribute

    public PostRouteAttribute(string template) : base(template ?? "", HttpMethod.Post)  

Esta clase permite agregar restricciones a la ruta generada

class MethodConstraintedRouteAttribute : RouteFactoryAttribute

    public MethodConstraintedRouteAttribute(string template, HttpMethod method)
        : base(template)
    
        Method = method;
    

    public HttpMethod Method
    
        get;
        private set;
    

    public override IDictionary Constraints
    
        get
        
            var constraints = new HttpRouteValueDictionary();
            constraints.Add("method", new MethodConstraint(Method));
            return constraints;
        
    

Esta es solo una restricción de ruta estándar, nit: es posible que desee almacenar en caché el objeto de restricciones para reducir las asignaciones.

class MethodConstraint : IHttpRouteConstraint

    public HttpMethod Method  get; private set; 

    public MethodConstraint(HttpMethod method)
    
        Method = method;
    

    public bool Match(HttpRequestMessage request,
                      IHttpRoute route,
                      string parameterName,
                      IDictionary values,
                      HttpRouteDirection routeDirection)
    
        return request.Method == Method;
    

No siempre es necesario especificar un RoutePrefix en su controlador. podría simplemente poner la ruta directamente en los métodos web:

public class BooksWriteController : EventStoreApiController

    [Route("api/Books")]
    public void Post([FromBody] CommandWrapper commandWrapper)...


public class BooksReadController : MongoDbApiController

    [Route("api/Books")]
    public TaskTypeInfo[] Get() ...


    [Route("api/Books/id:int")]
    public TaskTypeInfo Get(int id) ...

Sin embargo, me imagino que su RoutePrefix funcionaría bien en ambos controladores. Pienso que el attribute RoutePrefix se utiliza junto con el Route attribute que en realidad define la ruta. Esto significa que, siempre que no tenga rutas en conflicto (esto es un problema), debería estar bien.

Aquí tienes las reseñas y puntuaciones

Si aceptas, tienes la opción de dejar un artículo acerca de qué te ha parecido esta reseña.

¡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 *