WebAPI控制器继承和属性路由

时间:2014-04-28 14:08:41

标签: c# inheritance asp.net-web-api2 asp.net-web-api-routing

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

如何使用多种不同路线定义这些操作?

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

实施例

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

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

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

2 个答案:

答案 0 :(得分:11)

检查我在此处提供的答案WebApi2 attribute routing inherited controllers,该帖子引用了此帖.NET WebAPI Attribute Routing and inheritance的答案

您需要做的是覆盖DefaultDirectRoutePrivider

public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider {
    protected override IReadOnlyList<IDirectRouteFactory>
        GetActionRouteFactories(HttpActionDescriptor actionDescriptor) {
        // inherit route attributes decorated on base class controller's actions
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(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() {
        ...
    }
}

答案 1 :(得分:0)

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

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

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

我没有尝试过做RoutePrefix方式。