ASP.NET Web-api是否支持Odata资源路径?

时间:2012-05-15 13:26:40

标签: odata asp.net-mvc-4 asp.net-web-api

根据OData Uri约定http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption,以下Uri有效。 http://services.odata.org/OData/OData.svc/Category(1)/Products $顶部= 2&安培; $的OrderBy =名称

然而,ASP.NET Web-API似乎并不支持这一点(至少开箱即用)。它给出了一个错误,即无法找到名为Category(1)的控制器。

如何使用Web-API实现这项功能还是有解决方法?

1 个答案:

答案 0 :(得分:4)

我不确定为什么你的问题在你提出问题时没有引起注意......但这是一个真正的问题。 WebAPI支持大量的OData规范,但并非所有这些都符合我的理解。虽然,我还没有找到准确描述哪些方面有效的资源。开箱即用的默认路由支持一层嵌套,而不是像示例中的两层。如下所示:

mystuff.com/Category/5?$top2&orderby=name

据说,我认为你可以制作出你想要的东西。我没有编译/测试所有这些,所以请耐心等待......在global.asax设置一对像这样的路线:

routes.MapHttpRoute(name          : "WithCategoryFilter", 
                    routeTemplate : "api/v1/{controller}({catID})/{action}/{id}",
                    defaults      : new { id = RouteParameter.Optional}        );

routes.MapHttpRoute(name          : "WithoutCatFilter", 
                    routeTemplate : "api/v1/{controller}/{action}/{id}",
                    defaults      : new { id = RouteParameter.Optional}        );

请注意我注册路线的订单 - 首先放置类别过滤器。这些路线的相应控制器类似于:

 public class ProductCategoryController : BaseAPIController {
     public IEnumerable<Product> Products(int catID, int id) {
         var result = new List<Product>();

         //do category filtering here...

          return result;
     }
 }

因此,第一条路线允许应用类别过滤器(catID)和可选的ProductID(id)。当categoryID&amp;括号排除第二条路线将被捕获。您需要两条路线,因为没有一种很好的方法可以自动过滤掉括号。

作为旁注,你可能会对another answer I wrote感兴趣,这可能会识别你可能会遇到的其他一些路线体操。