Веб-API (1.x-2.x) не поддерживает несколько маршрутов атрибутов с одним и тем же путем на разных контроллерах. Результат — 404, поскольку все маршруты соответствуют более чем одному контроллеру, и в этот момент веб-API будет считать результат неоднозначным.
Обратите внимание, что MVC Core поддерживает это примечание к сценарию: MVC Core служит как MVC и веб-API.
Если вы решите использовать веб-API 2.11 (или новее), вы можете создать ограничение маршрута для метода http для каждого контроллера и использовать его вместо встроенного атрибута маршрута. В приведенном ниже примере показано, что вы можете использовать RoutePrefix или напрямую Routes (например, ответ 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) { }
}
Эти два класса упрощают использование атрибута маршрута ограничения.
class GetRouteAttribute : MethodConstraintedRouteAttribute
{
public GetRouteAttribute(string template) : base(template ?? "", HttpMethod.Get) { }
}
class PostRouteAttribute : MethodConstraintedRouteAttribute
{
public PostRouteAttribute(string template) : base(template ?? "", HttpMethod.Post) { }
}
Этот класс позволяет добавлять ограничения к сгенерированному маршруту.
class MethodConstraintedRouteAttribute : RouteFactoryAttribute
{
public MethodConstraintedRouteAttribute(string template, HttpMethod method)
: base(template)
{
Method = method;
}
public HttpMethod Method
{
get;
private set;
}
public override IDictionary<string, object> Constraints
{
get
{
var constraints = new HttpRouteValueDictionary();
constraints.Add("method", new MethodConstraint(Method));
return constraints;
}
}
}
Это просто стандартное ограничение маршрута, nit: вы можете кэшировать объект ограничений, чтобы уменьшить выделение.
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<string, object> values,
HttpRouteDirection routeDirection)
{
return request.Method == Method;
}
}
person
Yishai Galatzer
schedule
16.04.2014