WebAPI控制器继承和属性路由

我有几个控制器从相同的基类继承。 在他们不相互分享的不同行为中,他们确实有一些完全相同的行为。 我想将这些放在我的基类上,因为它们的功能完全相同,只是它们通过不同的路线进行访问。

我应该如何用几条不同的路线来定义这些动作?

我的继承类也有一个RoutePrefixAttribute集,因此它们都指向不同的路由。

我有一个叫做Vehicle基础抽象类,然后继承了CarBikeBus等等。他们都会有共同的行为Move()

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

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


检查我在这里给出的WebApi2属性路由继承的控制器的答案,其中引用来自此帖子的答案.NET WebAPI属性路由和继承

你需要做的是覆盖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() {
        ...
    }
}

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

我创建了基类ApiController类,并继承了它的所有API控制器。 我在我的基类中定义了删除操作(它返回string “不支持”),并没有在我的任何子控制器上定义删除。 现在,当我在我的任何控制器上执行删除时,我收到消息“不支持”,即调用基类的删除。 (我正在做Child上的删除请求,而不是基本的,即/ Bike / move)

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

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

链接地址: http://www.djcxy.com/p/78741.html

上一篇: WebAPI controller inheritance and attribute routing

下一篇: Connection issue with Jenkins slave on Windows Azure