[英]WebAPI controller inheritance and attribute routing
我有几个控制器从同一个基类继承。 在它们彼此不共享的不同动作中,它们确实有一些完全相同。 我希望在我的基类中包含这些,因为它们的工作方式完全相同,只是通过不同的路由访问它们。
我应该如何用几个不同的路线定义这些动作?
我继承的类也设置了RoutePrefixAttribute
,因此它们中的每一个都指向不同的路由。
我有一个叫做Vehicle
抽象基类,然后继承了Car
、 Bike
、 Bus
等。它们都有共同的动作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.