WebApi 2.x继承路由,但仅在特定动词的特定路径上匹配

时间:2019-01-22 16:03:18

标签: asp.net-web-api2 asp.net-web-api-routing

我试图使ApiController基类仅与特定的路由和动词一起使用,但是路由引擎默认将基类中的一个路由默认为任何没有匹配的动词和路由的调用。 / p>

例如:

[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);
    }
}

问题是任何调用不存在的动词/路径组合的请求都默认为基类中的ping端点

  • GET / api / v1 / service1 <-返回值字符串数组(正确)
  • GET / api / v1 / service1 / ping <-调用基类中的Ping()(正确)
  • 获取/ api / v1 / service1 / asdf <-返回404(正确)
  • POST / api / v1 / service1 / post <-调用Post()(正确)
  • 获取/ api / v1 / service1 / post <-调用基类中的Ping()(不正确)

这不是我要尝试做的。我希望针对未在控制器中定义的任何内容或“ GET [controller] / ping”上的完全匹配项返回错误。

在这种特殊情况下,如何将继承配置为不贪心?

0 个答案:

没有答案