WebAPI控制器继承和属性路由
我有几个控制器从相同的基类继承。 在他们不相互分享的不同行为中,他们确实有一些完全相同的行为。 我想将这些放在我的基类上,因为它们的功能完全相同,只是它们通过不同的路线进行访问。
我应该如何用几条不同的路线来定义这些动作?
我的继承类也有一个RoutePrefixAttribute
集,因此它们都指向不同的路由。
例
我有一个叫做Vehicle
基础抽象类,然后继承了Car
, Bike
, Bus
等等。他们都会有共同的行为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