Я пытаюсь заставить базовый класс ApiController работать только с конкретным маршрутом и глаголом, но механизм маршрутизации по умолчанию использует один маршрут в базовом классе для любого вызова, у которого нет соответствующего глагола и маршрута.
Например:
[RoutePrefix("api/v{version:apiVersion}/service1")]
[ApiVersion("1.0")]
public class Service1Controller : BaseApiController
{
// GET api/<controller>
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// POST api/<controller>
[Route("post")]
[HttpPost]
public void Post([FromBody]string value)
{
}
}
А мой базовый контроллер и DefaultDirectRouteProvider определены так:
public abstract class BaseApiController : ApiController
{
[HttpGet]
[Route("ping")]
public bool Ping()
{
return true;
}
}
public class ARouteProviderWithInheritance : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory>
GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(true);
}
}
И WebApiConfig выглядит так:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var constraintResolver = new DefaultInlineConstraintResolver
{
ConstraintMap =
{
["apiVersion"] = typeof(ApiVersionRouteConstraint)
}
};
var directRouteProvider = new ARouteProviderWithInheritance();
config.AddApiVersioning();
config.MapHttpAttributeRoutes(constraintResolver, directRouteProvider);
}
}
Проблема в том, что любой запрос, который вызывает несуществующую комбинацию глагол / путь, по умолчанию является конечной точкой пинга в базовом классе
- GET / api / v1 / service1 <- возвращает массив строк значений (правильный) </li>
- GET / api / v1 / service1 / ping <- вызывает Ping () в базовом классе (правильно) </li>
- GET / api / v1 / service1 / asdf <- возвращает 404 (правильно) </li>
- POST / api / v1 / service1 / post <- вызывает Post () (правильно) </li>
- GET / api / v1 / service1 / post <- вызывает Ping () в базовом классе (неверно) </li>
Это не то, что я пытаюсь сделать. Я хочу, чтобы ошибка возвращалась для всего, что не определено в контроллере, или для точного соответствия в 'GET [controller] / ping'.
Как настроить наследование, чтобы оно не было жадным в этом конкретном случае?