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.