Asp.net Restful MVC Web Api继承

Asp.net Restful MVC Web Api继承,asp.net,asp.net-mvc,asp.net-mvc-routing,asp.net-mvc-4,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Mvc Routing,Asp.net Mvc 4,Asp.net Web Api,我正在为自己构建一个asp.NETMVC4WebAPI 我已经经历了一段时间,我认为他们很好。使用Http动词。资源是名词,它与存储库等有关 但有一件事真的让我心烦 我的印象是这http://www.myurl.com/api/sellers/{id}/products是restful且GEThttp://www.myurl.com/api/products?$filter=sellerID eq{id}不可用 在我读到的关于新web api的内容中,我看到的只是前者和后者 后者是否有本土支持?

我正在为自己构建一个asp.NETMVC4WebAPI

我已经经历了一段时间,我认为他们很好。使用Http动词。资源是名词,它与存储库等有关

但有一件事真的让我心烦

我的印象是这
http://www.myurl.com/api/sellers/{id}/products
是restful且
GEThttp://www.myurl.com/api/products?$filter=sellerID eq{id}
不可用

在我读到的关于新web api的内容中,我看到的只是前者和后者

后者是否有本土支持?如果没有,是否有办法在不发送所有内容的情况下执行


编辑-
我正在寻找允许
GET的东西http://www.myurl.com/api/sellers/{id}/products
GEThttp://www.myurl.com/api/products
etc


更新:
这个问题暂时没有意义,我已经解决了,但这就是为什么第一个答案没有标记为正确的原因


更新:

与MilkyWayJoe聊天后,我们讨论了将
/Seller/2/产品
转换为
/Products?$filter=sellerID eq 2
。有人知道怎么做吗?

url
http://www.myurl.com/api/products?$filter=sellerID eq{id}
正在使用过滤器,当控制器以
IQuerable
的形式返回集合时,Web API中的过滤器会立即使用。VS 2012中的默认值当前设置为
IEnumerable
,不支持OData


您可以找到有关这方面的更多信息。

可以使用嵌套资源(至少在URL构造中是这样),但MVC中没有太多对的支持;大部分工作你得自己做

首先,您需要创建一条路线来处理您的结构:

url: "sellers/{sellerId}/products",
defaults: new { controller = "sellers", action = "GetProducts" }
然后,您需要在“Sellers”控制器上创建
GetProducts
操作,此路由应将呼叫者引导到:

[HttpGet]
public IEnumerable<Product> GetProducts(int sellerId)
{
    //TODO: Add query to return results.
}
[HttpGet]
公共IEnumerable GetProducts(int-sellerId)
{
//TODO:添加查询以返回结果。
}
sellerId
参数将通过路由传入,并应用于驱动查询


这种方法的主要缺点是,自定义路由使得为资源之间的链接生成URL变得更加困难,当它们变得更复杂时,它们可以开始匹配您不希望它们匹配的URL。

我正在寻找解决您同样问题的方法。我目前正在测试这个解决方案

首先,改变路线:

    routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}/{action}/{id2}",
            defaults: new { id = RouteParameter.Optional, action = "Index", id2 = RouteParameter.Optional }
        );
然后,如果您想要一个
SellersController
,请按常规编写,但要将所有操作命名为“Index”,并使用符号正确路由http谓词。例如:

     [HttpGet]
     public List<Seller> Index()
     {}
这样你就可以打电话了

     GET /api/sellers
     or GET /api/sellers/99/products
     or GET /api/sellers/99/products/2

我实际上正在测试这种方法,因此任何反馈都将不胜感激

对不起,我无意中说了后者,而我指的是前者。我已经编辑并修复了这个问题。@MrJD请看编程英雄的回答。它基本上是一种不同的路由模式,类似于rails的路由。检查一下,你会发现还有其他类似的路径,例如,
GET/people/1/edit
,它本质上是一个GET,我只是在GET前面加上了明确定义动词的前缀。这不一定与这个问题有关。该方法需要我为每个端点路由每个嵌套情况。我希望有一种方法可以从中抽象出来,我不知道你还能如何注册基于FK的查询路由(可能是因为我缺乏url路由的经验)。我通常为这些场景注册类似的路由,同样,这是一个非常类似于rails和/或sinatra路由的约定(如果不完全相同的话),所以我想您必须注册这些其他路由。是否可以注册一个“嵌套”区域,例如`{nestedArea}/products',然后以某种方式将其转换为OData?或者以某种方式使用iquirable结果?我的问题指定了“不发送所有内容”。这是可行的,但是我不想为一个端点创建4条深嵌套路由。只是效率不高。唉,正如我所说,MVC4不能自然地支持您正在尝试做的事情。通过在路由中定义更多参数,您可以使路由重复使用,但最终,如果您希望将特定URL解析为特定操作和控制器,路由系统就是为了解决这个问题而设计的。我只是在寻找可变路由。阅读MilkyWayJoe答案评论的最后部分。我提到将路由参数转换为OData结构,这很聪明。然而,它的规模不像我想要的。例如。假设产品可以有评论,并且您希望为卖家142请求所有评论。请求看起来像:/sellers/142/products/reviews。这是一个3级的要求。遗憾的是,您的示例最多可以处理两个问题
     GET /api/sellers
     or GET /api/sellers/99/products
     or GET /api/sellers/99/products/2