2014-11-05 83 views
0

我正试图为我们的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" 
     }; 
    } 
} 

我们预计,默认的工作是这样的:

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

,我们结束了与此异常返回的响应:

​​

是否有可能微软刚刚错过的逻辑/规定使用Order作为路线消除歧义,这是一个错误?还是有另一种简单的方法来覆盖路线,希望有一个属性?

回答

0

我有几乎相同的问题。我创建了一个初学者网站,但我希望用户能够重新定义控制器的行为,特别是如果有错误。

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

我要做的可能是去URL重写。特别是因为这个问题对我而言是暂时的。不过,如果有人有更好的选择,我会感兴趣。