【问题标题】:Can I have multiple POST methods in Web API with different complex parameter types?我可以在 Web API 中使用具有不同复杂参数类型的多个 POST 方法吗?
【发布时间】:2015-04-04 02:04:11
【问题描述】:

我是 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,只有资源)。我也不能将 2nd Post 放在不同的控制器上。

我让它工作的唯一方法是将 FolderModel 和 DocumentModel 包装在一个父对象中,如下所示:

public class WorkitemCreateModel
{
    public DocumentModel Document { get; set; }
    public FolderModel Folder { get; set; }
}

public HttpResponseMessage Post( [FromBody] WorkitemCreateModel theModel )

然后有一个采用 WorkitemCreateModel 的 Post 方法。但是,使用我的 API 的开发人员有责任他们必须传入 WorkitemCreateModel 但他们只能传入 DocumentModel 对象或 FolderModel 对象。这也很烦人,因为我的 GET API 可以返回 DocumentModel 对象或 FolderModel 对象。因此,最好将您从 GET 获得的对象传递给 POST。但这不起作用,他们必须先将其包装在 WorkitemCreateModel 对象中。

还有其他建议吗?

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

【问题讨论】:

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


    【解决方案1】:

    这可能是一篇旧帖子,但我添加此信息是为了以防像我这样来这里寻找答案的人。

    这里的简短回答是不,不可能

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

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

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

    希望这会有所帮助...

    【讨论】:

      【解决方案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

      【讨论】:

      • 感谢您的回复...我看到了其他链接,但没有帮助。我试过你的建议。它也没有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2018-07-05
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多