WebAPI子资源路由映射保持默认行为

时间:2016-02-11 06:46:52

标签: c# api asp.net-web-api asp.net-web-api2 url-routing

是否可以仅使用一条路线映射以下操作?

14 21 39 48 109 3882

在我的public class SimpleDataController : ApiController { // GET /SimpleData public List<MyObject> Get(){ return new List<MyObject>();}; // GET /SimpleData/4 public MyObject Get(int objectId){ return new MyObject{Id = objectId);}; // GET /SimpleData/4/ObjectsForId public List<MySubObject> ObjectsForId(int objectId){ return new List<MySubObject>();}; // GET /SimpleData/4/ObjectsForId/3 public MySubObject ObjectsForId(int objectId, int subObjectId){ return new MySubObject();}; } 我已将以下代码添加到路线中:

WebApiConfig.cs

这适用于:

  • config.Routes.MapHttpRoute( name: "OneLevelNested", routeTemplate: "api/{controller}/{id}/{action}/{subId}", defaults: new { subId = RouteParameter.Optional } ); GET /SimpleData/4/ObjectsForId

对于GET /SimpleData/4/ObjectsForId/3,我收到以下错误:

  

请求的资源不支持http方法'GET'。

对于GET /SimpleData我得到:

  

找到了与请求匹配的多个操作:Get类型Controllers.SimpleDataController ObjectsForId类型Controllers.SimpleDataController

我已尝试将GET /SimpleData/4的默认值设置为“获取”,这适用于上述示例,但actionPOST和{{1}将失败因为它还会检查名为“Get”的PUT。 有什么技巧我不知道吗?

我不想为每个控制器创建新的映射。

1 个答案:

答案 0 :(得分:0)

您需要使参数id也可选。否则是始终需要的参数,路由GET / SimpleData将不起作用。

config.Routes.MapHttpRoute(
  name: "OneLevelNested",
  routeTemplate: "api/{controller}/{id}/{action}/{subId}",
  defaults: new { subId = RouteParameter.Optional, id= RouteParameter.Optional }
);