我正试图为我们的REST API开发团队标准化一个扩展模型。我们需要提供路由的默认实现,同时允许自定义路由替代默认实现。如何覆盖web 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
作为路线消除歧义,这是一个错误?还是有另一种简单的方法来覆盖路线,希望有一个属性?