如何覆盖web api路由?

时间:2014-11-05 18:44:18

标签: asp.net-web-api routes override customization

我正在尝试为REST API开发团队标准化扩展模型。我们需要提供路由的默认实现,同时允许自定义实现替换默认路由的路由。

作为一个简单的例子,如果我们有这样的GET路线api/users

public class DefaultUsersController : ApiController
{
    [HttpGet]
    [Route("api/users", Order = 0)]
    public IEnumerable<string> DefaultGetUsers()
    {
        return new List<string>
        {
            "DefaultUser1",
            "DefaultUser2"
        };
    }
}

我们希望默认工作如下:

enter image description here

现在开发人员想要改变该路由的行为,他应该能够简单地使用某种机制来定义相同的路由,以暗示他们的实现应该是使用的,而不是默认的。我最初的想法是使用Order property on the Route attribute,因为这就是它的用途,作为一种在发现模糊路线时提供优先级(按升序排列)的方法。但是它没有那样工作,请考虑我们想要覆盖默认api/users路由的自定义实现:

public class CustomUsersController : ApiController
{
    [HttpGet]
    [Route("api/users", Order = -1)]
    public IEnumerable<string> CustomGetUsers()
    {
        return new List<string>
        {
            "CustomUser1",
            "CustomUser2"
        };
    }
}

请注意,Order属性设置为-1,以使其优先级值低于默认值,设置为0.我原本认为这将由DefaultHttpControllerSelector使用,但它不是。来自DefaultHttpControllerSelector

enter image description here

我们最终会在响应中返回此异常:

enter image description here

微软是否有可能错过了使用Order作为路由消歧器的逻辑/要求,这是一个错误?或者是否有另一种简单的方法来覆盖路线,希望有一个属性?

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我正在创建一个启动站点,但我希望用户能够重新定义Controller的行为,尤其是在存在错误的情况下。

我使用Autofac来解析Controller,但即使我将新控制器注册为旧控制器,也会选择原来的控制器。

我要做的可能是使用URL重写。特别是因为这个问题在我的情况下是暂时的。但是,如果有人有更好的选择,我会感兴趣。