正确处理 ASP.net MVC 4 Web Api 路由中的嵌套资源
Posted
技术标签:
【中文标题】正确处理 ASP.net MVC 4 Web Api 路由中的嵌套资源【英文标题】:Properly handling nested resources in ASP.net MVC 4 WebApi routing 【发布时间】:2013-07-05 16:25:50 【问题描述】:我想以这种方式提供 REST API:
GET /api/devices
POST /api/devices
PUT /api/devices/1
DELETE /api/devices/1
这是我的配置:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
这些是行动:
public IEnumerable<Device> Get()
//return all devices
public Devices Get(id)
//return a specific devices
等等。
当我要处理嵌套资源时出现问题:
GET /api/devices/1/readings
POST /api/devices/1/readings
GET /api/devices/1/readings/1
PUT /api/devices/1/readings/1
DELETE /api/devices/1/readings/1
这是我对这些的配置:
config.Routes.MapHttpRoute(
name: "NestedApi",
routeTemplate: "api/controller/parentResourceId/action/id",
defaults: new id = RouteParameter.Optional
);
在尝试 GET 和 POST 到嵌套资源时出现问题:
[HttpGet]
public String Readings(int parentResourceId)
//return a list of readings for the device
[HttpPost]
public String Readings(int parentResourceId)
//create and return the id of a reading for the device
这当然是失败的,因为有两个具有相同签名的操作。
我想听听以最 RESTful 的方式完成此任务的方法
【问题讨论】:
这看起来像是 ***.com/q/10783946/326110 和 ***.com/questions/9594671/… 的副本 【参考方案1】:Microsoft 正在添加属性路由以增加路由系统的灵活性。 在场景 3 中查看 their documentation
Stack Overflow 上也有一些答案,比如:
How to handle hierarchical routes in ASP.NET Web API?
【讨论】:
【参考方案2】:有基于指定路由映射的解决方案,但如果您想要更通用的解决方案,this 是迄今为止我见过的与此主题相关的最佳解决方案。当然,Web API 2 有属性路由。
【讨论】:
以上是关于正确处理 ASP.net MVC 4 Web Api 路由中的嵌套资源的主要内容,如果未能解决你的问题,请参考以下文章
ASP .NET MVC 4 WebApi:手动处理 OData 查询
ASP.Net MVC 3/4 托管在 IIS 7.5 默认处理程序映射上