我正在尝试为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"
};
}
}
我们希望默认工作如下:
现在开发人员想要改变该路由的行为,他应该能够简单地使用某种机制来定义相同的路由,以暗示他们的实现应该是使用的,而不是默认的。我最初的想法是使用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
:
我们最终会在响应中返回此异常:
微软是否有可能错过了使用Order
作为路由消歧器的逻辑/要求,这是一个错误?或者是否有另一种简单的方法来覆盖路线,希望有一个属性?
答案 0 :(得分:0)
我有同样的问题。我正在创建一个启动站点,但我希望用户能够重新定义Controller的行为,尤其是在存在错误的情况下。
我使用Autofac来解析Controller,但即使我将新控制器注册为旧控制器,也会选择原来的控制器。
我要做的可能是使用URL重写。特别是因为这个问题在我的情况下是暂时的。但是,如果有人有更好的选择,我会感兴趣。