我可以在具有不同复杂参数类型的Web API中使用多个POST方法吗?

我是Web API的新手……这是我的基本路线:

config.Routes.MapHttpRoute( name: "Workitems", routeTemplate: "api/{controller}/{workitemID}", defaults: new { controller = "workitems", workitemID = RouteParameter.Optional } ); 

这是我想要的:

 public HttpResponseMessage Post( [FromBody] FolderModel theModel ) public HttpResponseMessage Post( [FromBody] DocumentModel theModel ) 

但是,Web API找不到我的第二个Post方法。 我在这里和谷歌都做了很多搜索,但没有发现任何对我有用的东西(好)。 我知道我可以在第二种方法中添加第二个未使用的参数 – 但这太糟糕了。 如果这是正常的C#代码,那么编译器就可以知道选择b / c哪个方法具有不同的签名。 但Web API不够智能。

我查看了自定义约束,但这似乎不合适。 我也不能使用不同的{actions},因为它违反了我的API的RESTful约束(没有RPC,只有资源)。 我也不能把第二篇文章放在不同的控制器上。

我实现这一点的唯一方法是将FolderModel和DocumentModel包装在父对象中,如下所示:

 public class WorkitemCreateModel { public DocumentModel Document { get; set; } public FolderModel Folder { get; set; } } public HttpResponseMessage Post( [FromBody] WorkitemCreateModel theModel ) 

然后有一个Post方法,它采用WorkitemCreateModel。 但是,使用我的API的开发人员必须在WorkitemCreateModel中传递它们,但是它们只能传入DocumentModel对象或FolderModel对象。 令人讨厌的是我的GET API可以返回DocumentModel对象或FolderModel对象。 所以,将你从GET获得的对象传递给POST会很好。 但这不起作用,他们必须首先将它包装在WorkitemCreateModel对象中。

还有其他建议吗?

顺便说一句:这个网站是最好的! 我在这里找到了很多答案!

这可能是一个旧post,但我添加此信息,以防万一像我这样的人来到这里寻找答案。

这里简短的答案是否定的,这是不可能的

问题在于路由的工作方式,特别是关于选择使用哪种操作方法的部分。 以下是ASP .NET文章( https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection )的摘录,

选择算法的目标是在调用任何绑定之前从静态描述中选择一个动作。 因此,复杂类型从匹配算法中排除。

因此,在将操作方法​​与路径匹配时,Web API 忽略该方法的参数列表中的所有复杂类型 ,当您这样做时,两个方法都有0个参数,这就是您遇到此问题的原因。

希望这可以帮助…

您是否考虑过更改方法名称并尝试使用[HttpPost]属性?

资料来源: http : //www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

这可能会回答您的问题: Web API控制器中的多个HttpPost方法