Web Api 2.2基本控制器,带有可以覆盖的端点,保持路由

时间:2014-10-10 19:17:40

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

我在使用webapi 2.2路由时遇到了一些麻烦。我已将v5.2安装到我的项目中并修改了我的配置以使用Custom DirectRouteProvider

public class CustomDirectRouteProvider : DefaultDirectRouteProvider
        {
            protected override IReadOnlyList<IDirectRouteFactory>
            GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
            {
                return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
                (inherit: true);
            }
        }

现在我已经设置了一个基本控制器,其中包含我想要覆盖的方法,例如

    [HttpGet]
    [Route("")]
    [EnableQuery]
    public async virtual Task<IHttpActionResult> Get()
    {
        var data = await DomainService.GetQueryable();
        if (data != null)
        {
           return Ok(data);
        }
        return NotFound();

    }

如果我运行项目并调用类似http://localhost:3000/somecontroller的端点,则会调用上面的Get()方法。 如果在某个控制器内我尝试

    [HttpGet]
    [EnableQuery]
    [Route("")]
    public async override Task<IHttpActionResult> Get()
    {

        var data = await _skillRepository.ParentSkillsAsync();
        if (data != null)
        {
            return Ok(data);
        }
        return NotFound();
    }

我收到错误

  

找到了与请求匹配的多项操作

反正有没有做我在这里尝试的事情?试图让它发挥作用令人沮丧。

谢谢

1 个答案:

答案 0 :(得分:0)

丹 - 我自己遇到了同样的麻烦,这就是我解决它的方法。 我不确定这是否是最佳解决方案,但它对我有用。

在我的路由属性上,我将Order属性的值3添加到基类的操作中。 Order属性的默认值为0,因此派生类的值将为0。 基类需要具有高于派生类的Order属性。

因此,在您的示例中,我相信这将允许您的代码按照您希望的方式工作:

基类中的操作

[HttpGet]
[Route("", Order=3)]
[EnableQuery]
public async virtual Task<IHttpActionResult> Get()
{
    var data = await DomainService.GetQueryable();
    if (data != null)
    {
       return Ok(data);
    }
    return NotFound();
}

派生类中的操作:

[HttpGet]
[EnableQuery]
[Route("")]
public async override Task<IHttpActionResult> Get()
{
    var data = await _skillRepository.ParentSkillsAsync();
    if (data != null)
    {
        return Ok(data);
    }
    return NotFound();
}