我无法弄清楚我需要使用MVC路由来完成这项工作
这是我的一条路线:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
);
请求 / Shipments / 效果很好。
请求 / Shipments / 3 / Packages 效果很好。
请求 / Shipments / 3 但失败并显示错误:
找到与请求匹配的多个操作: System.Linq.IQueryable`1 [Api.Controllers.RequisitionsController + PackageRequisitionWithTracking] GetPackageRequisitions(Int32)类型 Api.Controllers.RequisitionsController Api.Models.ShipmentRequisition GetShipmentRequisitions(Int32)类型 Api.Controllers.RequisitionsController
似乎无法区分:
// No ActionName
public ShipmentRequisition GetShipmentRequisitions(int id)
和
[ActionName("Packages")]
public IQueryable<PackageRequisitionWithTracking> GetPackageRequisitions(int id)
我原以为在id上获取货物时缺少行动名称会让该路线发挥作用。
答案 0 :(得分:0)
这里已经回答了几次 - 你不能混合REST样式路由(你要求控制器使用GET,它返回默认的Get动作)和RPC路由(你提供明确的动作名称)在路径中)单控制器。
Web API不知道将哪个操作用作默认的“GET”操作。
ASP.NET Web Stack的Codeplex上的Web API团队有一个问题 - http://aspnetwebstack.codeplex.com/workitem/184。
现在最好的办法是将控制器分为使用REST路由(基于HTTP谓词的路由)和RPC路由(基于URL中的操作名称的路由)的控制器。