我是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对象中。
还有其他建议吗?
顺便说一句:这个网站是最好的!我在这里找到了很多答案!答案 0 :(得分:6)
这可能是一个旧帖子,但我正在添加此信息,以防万一这样的人来到这里寻找答案。
这里简短的回答是 NO,它不可能 。
问题在于路由的工作方式,尤其是关于选择使用哪种操作方法的部分。以下是ASP .NET文章(https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection),
的摘录选择算法的目标是在调用任何绑定之前从静态描述中选择一个动作。因此,复杂类型将从匹配算法中排除。
因此,在将操作方法与路径匹配时,Web API 忽略该方法的参数列表中的所有复杂类型,当您这样做时,两个方法都有0个参数,并且你为什么要面对这个问题。
希望这会有所帮助......
答案 1 :(得分:2)
您是否考虑过更改方法名称并尝试使用[HttpPost]
属性?
来源:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
这可能会回答您的问题: Multiple HttpPost method in Web API controller