【问题标题】:Does ASP.NET Web-api support Odata resource path?ASP.NET Web-api 是否支持 Odata 资源路径?
【发布时间】:2012-05-23 00:33:00
【问题描述】:

根据 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 进行这项工作,或者是否有解决方法?

【问题讨论】:

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


【解决方案1】:

我不确定为什么您提出的问题没有引起注意......但这是一个真正的问题。 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 和括号时,第二条路线将被捕获。您需要两条路线,因为没有一种自动过滤掉括号的好方法。

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

【讨论】:

  • 这就是我之前尝试过但没有奏效的方法。即 api/{controller}({resourceId})/{action} 转换为 api/Category(1)/products 并抛出错误消息“未找到与名为 'Category(1)' 的控制器匹配的类型” .
  • 再仔细看看答案。我尝试了上述方法,它对我有用。您需要一对路线。一种适用于提供类别(并包括括号),一种适用于未提供类别。注意我注册路线的顺序。我怀疑你的情况正好相反。
  • 是的,就是这样。我可以在更改路线顺序后让它工作。非常感谢!
猜你喜欢
  • 2014-06-19
  • 2012-06-20
  • 2013-05-24
  • 2012-08-10
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2020-09-19
  • 2012-06-15
相关资源
最近更新 更多