ASP.NET WebAPI2属性路由和子文件夹

时间:2015-11-16 16:02:39

标签: asp.net-web-api2 attributerouting

我在WebAPI中使用属性路由。我的问题更多的是在WebAPI中的控制器下创建子文件夹(不是在MVC中,我使用区域)

我搜索了它会对现有路由模式造成什么样的影响,而且大多数人都提到在WebAPIConfig.cs中添加自定义路由模板。 但由于我使用的是AttributeRouting,是否真的需要创建自定义模板?

我测试了我的代码,它似乎工作正常,没有任何自定义模板,我也可以通过在Controllers文件夹下创建子文件夹来实现模块化,但是想知道最佳实践和解决方案。

2 个答案:

答案 0 :(得分:2)

否 - 如您所知,如果您使用的是属性路由,则无需创建自定义模板。

底层方法(MapAttributeRoutes)调用Controller工厂来查找从Controller继承的所有类,然后检查那些Route属性 - 所以它们位于命名空间中等级并不重要。

如果您尝试混合属性和约定路由并且具有基于约定的路线的子文件夹,那么您将需要定义自定义模板。

答案 1 :(得分:2)

仅供参考:当使用属性路由(重新)在子文件夹中组织控制器时,您需要注意一个小的“catcha”。确保您的控制器类具有唯一的名称!否则属性路由会混淆并且不起作用。举例说明:

// File: ~/Controllers/Customers/DetailsController.cs
namespace MyProject.Controllers.Customerss 
{
    [RoutePrefix("~/api/customers/{id}")]
    public class DetailsController: ApiController {
        [HttpGet]
        public IHttpMessageResult GetItem(int id) {...}
    }
}

// File: ~/Controllers/Orders/DetailsController.cs
namespace MyProject.Controllers.Orders 
{
    [RoutePrefix("~/api/orders/{id}")]
    public class DetailsController: ApiController {
        [HttpGet]
        public IHttpMessageResult GetItem(int id) {...}
    }
}

虽然,有了不同的路由并确实指向不同的控制器类,但它会抛弃属性路由。通过将控制器类更改为CustomerDetailsControlller和OrderDetailsController,路由问题自行解决。