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

pri*_*fan 8 c# rest asp.net-web-api

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

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

这是我想要的:

public HttpResponseMessage Post( [FromBody] FolderModel theModel )
public HttpResponseMessage Post( [FromBody] DocumentModel theModel )
Run Code Online (Sandbox Code Playgroud)

但是,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 )
Run Code Online (Sandbox Code Playgroud)

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

还有其他建议吗?

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

M22*_*2an 6

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

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

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

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

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

希望这可以帮助...


小智 1

您是否考虑过更改方法名称并尝试使用该[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