繁体   English   中英

WebAPI 控制器继承和属性路由

[英]WebAPI controller inheritance and attribute routing

我有几个控制器从同一个基类继承。 在它们彼此不共享的不同动作中,它们确实有一些完全相同。 我希望在我的基类中包含这些,因为它们的工作方式完全相同,只是通过不同的路由访问它们。

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

我继承的类也设置了RoutePrefixAttribute ,因此它们中的每一个都指向不同的路由。

例子

我有一个叫做Vehicle抽象基类,然后继承了CarBikeBus等。它们都有共同的动作Move()

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

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

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

您需要做的是覆盖DefaultDirectRouteProvider

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 方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM