WebAPI控制器inheritance和属性路由

我有很少的控制器inheritance自相同的基类。 在他们不相互分享的不同行动中,他们确实有一些完全相同。 我想在我的基类上有这些,因为它们都完全相同,只是它们通过不同的路径访问。

我应该如何用几种不同的路线定义这些行为?

我inheritance的类也设置了RoutePrefixAttribute ,因此每个类都指向不同的路由。

我有一个名为Vehicle基础抽象类,然后inheritance了CarBikeBus等所有这些都有共同的动作Move()

 /bus/move /car/move /bike/move 

如何在我的基类Vehicle上定义动作Move() ,以便它在每个子类路由上执行?

检查我在这里给出的答案WebApi2属性路由inheritance控制器 ,它引用了这篇文章的答案.NET WebAPI属性路由和inheritance

您需要做的是覆盖DefaultDirectRoutePrivider

 public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { // inherit route attributes decorated on base class controller's actions return actionDescriptor.GetCustomAttributes(inherit: true); } } 

完成后,您需要在Web api配置中进行配置

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { ..... // Attribute routing. (with inheritance) config.MapHttpAttributeRoutes(new WebApiCustomDirectRouteProvider()); .... } } 

然后,您就可以按照这样的描述进行操作

 public abstract class VehicleControllerBase : ApiController { [Route("move")] //All inheriting classes will now have a `{controller}/move` route public virtual HttpResponseMessage Move() { ... } } [RoutePrefix("car")] // will have a `car/move` route public class CarController : VehicleControllerBase { public virtual HttpResponseMessage CarSpecificAction() { ... } } [RoutePrefix("bike")] // will have a `bike/move` route public class BikeController : VehicleControllerBase { public virtual HttpResponseMessage BikeSpecificAction() { ... } } [RoutePrefix("bus")] // will have a `bus/move` route public class BusController : VehicleControllerBase { public virtual HttpResponseMessage BusSpecificAction() { ... } } 

这就是我所做的,它按照你在问题中提到的方式工作。

我创建了基础ApiController类并从中inheritance了我的所有API控制器。 我在我的Base类中定义了Delete操作(返回string “Not Supported”)并且没有在我的任何子控制器上定义delete。 现在,当我在任何控制器上执行删除时,我收到消息“不支持”,即调用基类的删除。 (我正在对孩子做删除请求,而不是基于ie / Bike / move)

但是如果我在任何一个控制器上定义一个删除它会给我一个隐藏基础实现的警告,但是在做api的删除请求时我得到了 – "An error has occurred."

我还没有尝试过做RoutePrefix的方式。