WebApi 2.x наследует маршрутизацию, но совпадает только по определенному пути для определенных глаголов - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь заставить базовый класс 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'.

Как настроить наследование, чтобы оно не было жадным в этом конкретном случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...