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

时间:2015-04-04 02:04:12

标签: c# rest asp.net-web-api

我是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对象中。

还有其他建议吗?

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

2 个答案:

答案 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