.NET WebAPI属性路由和inheritance

我玩弄了一个基本控制器的概念,该控制器使用通用存储库为我的API控制器提供基本的CRUD方法,这样我就不必在每个新控制器中复制相同的基本代码。 但是遇到了路由属性在基本控制器中被识别的问题。 为了确切显示我遇到的问题,我创build了一个非常简单的WebAPI控制器。

当我在主控制器中的Get方法,并直接从ApiControllerinheritance我没有任何问题,并按预期工作。

[RoutePrefix("admin/test")] public class TestController : ApiController { [Route("{id:int:min(1)}")] public string Get(int id) { return "Success"; } } 

当我将Get方法移动到基本控制器时,它将返回404页面的内容。

 [RoutePrefix("admin/test")] public class TestController : TestBaseController { } public class TestBaseController : ApiController { [Route("{id:int:min(1)}")] public string Get(int id) { return "Success"; } } 

一些更有趣的笔记:

  • 我可以在GET / Test / 1上访问这个动作。 所以它仍然是基于默认路由的。

  • 当我尝试访问POST / admin / test时,它返回以下JSON

    {“Message”:“找不到与请求URI匹配的HTTP资源”,“MessageDetail”:“没有find与名为”admin“的控制器相匹配的types。 “ }

有谁知道一种方法来使路由与基本控制器的属性一起工作吗?

属性路由不能被inheritance。 这是一个故意的devise决定。 我们感觉不对,并没有看到有效的情况下inheritance它们是有意义的。

你可以给一个更现实的情况下,你想在哪里使用这个?

[ 更新 (3/24/2014)]
在即将到来的5.2版MVC Web API中,将会有一个名为System.Web.Http.Routing.IDirectRouteProvider的扩展点,通过它可以启用您在此寻找的inheritance场景。 你可以尝试使用最新的夜晚版本(关于如何使用夜间版本的文档在这里

[ 更新 (7/31/2014)]
在Web API 2.2发行版中可以如何完成的示例:

 config.MapHttpAttributeRoutes(new CustomDirectRouteProvider()); //--------- public class CustomDirectRouteProvider : 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 2.2,您可以:

 public class BaseController : ApiController { [Route("{id:int}")] public string Get(int id) { return "Success:" + id; } } [RoutePrefix("api/values")] public class ValuesController : BaseController { } config.MapHttpAttributeRoutes(new CustomDirectRouteProvider()); public class CustomDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { return actionDescriptor.GetCustomAttributes<IDirectRouteFactory> (inherit: true); } } 

如下所述: http : //www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22

得到它了。

 [Route("api/baseuploader/{action}")] public abstract class BaseUploaderController : ApiController { [HttpGet] public string UploadFile() { return "UploadFile"; } } [Route("api/values/{action}")] public class ValuesController : BaseUploaderController { [HttpGet] public string Get(int id) { return "value"; } } 

这里需要注意的一点是,路由动作参数必须与动作名称相同。 我找不到解决办法。 (您不能使用RouteAttribute重命名路由)