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

Vis*_*hal 4 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?$ top = 2&$ orderby = name

但是,ASP.NET Web-API似乎不支持此功能(至少是开箱即用的)。它导致无法找到名为Category(1)的控制器的错误。

如何使它与Web-API一起使用还是可以解决的?

EBa*_*arr 5

我不确定为什么当您提出问题时您的问题没有引起注意。但这是一个真正的问题。WebAPI支持很多OData规范,但据我所知并不是全部。虽然,我还没有找到确切描述哪些方面有效的资源。开箱即用的默认路由支持一层嵌套,而不像您的示例中那样支持两层嵌套。所以像:

mystuff.com/Category/5?$top2&orderby=name
Run Code Online (Sandbox Code Playgroud)

话虽如此,我认为您可以制作出自己想要的东西。我还没有编译/测试的这一切,所以忍耐一下....在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}        );
Run Code Online (Sandbox Code Playgroud)

注意我注册路线的顺序-首先放置类别过滤器。这些路由的相应控制器看起来像:

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

         //do category filtering here...

          return result;
     }
 }
Run Code Online (Sandbox Code Playgroud)

因此,第一条路线将允许应用类别过滤器(catID)和可选的ProductID(id)。如果排除categoryID和括号,则第二条路线将生效。您需要两条路线,因为没有一种自动过滤掉括号的好方法。

附带一提,您可能会对我写的另一个答案感兴趣,该答案确定了您可能会遇到的其他路线体操。