C# 如何使用ASP.NETWebAPI重载方法?

C# 如何使用ASP.NETWebAPI重载方法?,c#,asp.net,asp.net-web-api,put,C#,Asp.net,Asp.net Web Api,Put,我有两个方法,一个接受poco,另一个接受控制器类中的poco列表: [AcceptVerbs("PUT")] [ActionName("Item")] public void SaveItem([FromBody] Item item) { m_controller.SaveItem(item); } [AcceptVerbs("PUT")] [ActionName("Items")] public void SaveItems([FromBody] List&

我有两个方法,一个接受poco,另一个接受控制器类中的poco列表:

[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] Item item)
{
    m_controller.SaveItem(item);           
}

[AcceptVerbs("PUT")]
[ActionName("Items")]
public void SaveItems([FromBody] List<Item> items)
{
    m_controller.SaveItem(items);
}
这正如预期的那样有效。但是我想重构代码来尝试重载。我试图在我的控制器中重载方法,但只有一条路由,但失败了,请求无效。我认为webapi将通过验证参数来解决调用问题——如果它是一个列表,那么它将调用重载方法,并将列表作为参数,否则调用另一个方法。我计划做一些类似的事情:

routes.MapHttpRoute("Item Route",
                    "api/item/{orderId}",
                    new
                    {
                        controller = "MyOrder",
                        action = "Item",
                        orderId = RouteParameter.Optional
                    });

routes.MapHttpRoute("Items Route",
                    "api/items/{orderId}",
                    new
                    {
                        controller = "MyOrder",
                        action = "Items",
                        orderId = RouteParameter.Optional
                    });
[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] Item item)
{
    m_controller.SaveItem(item);           
}

[AcceptVerbs("PUT")]
[ActionName("Item")]
public void SaveItem([FromBody] List<Item> items)
{
    m_controller.SaveItem(items);
}
routes.MapHttpRoute("Item Route",
                    "api/item/{orderId}",
                    new
                    {
                        controller = "MyOrder",
                        action = "Item",
                        orderId = RouteParameter.Optional
                    });

我怀疑路线没有考虑到尸体。在您的情况下,确定使用哪个重载的唯一方法是正确地解析主体和路由。您可以做的一个简化是始终使用单个方法获取项目列表。然后,对于单个项目,只需将该项目包含在列表中。

Web API使用称为IHttpActionSelector的东西来确定要在控制器中调用的操作。我认为默认实现不支持这种情况下的重载。您可以实现自定义IHttpActionSelector,但这可能需要大量工作。看看这篇博文中的样本


如果只支持一个场景,您总是会收到一个项目列表,则会简单得多。对于一个项目,它只是一个包含单个项目的列表。

您遇到了什么异常?我总是收到“500错误-无效请求”。没什么。你远程访问了吗?我同意,我们就是这样做的,让另一个api只有一个带列表的方法。我想知道我是否可以超载。谢谢你的链接。。看起来工作量不大,但看起来像是黑客。但是很高兴能给你一个想法。但我想,我应该简单明了地使用一种方法,接受Jim建议的列表,就像我们在另一个api中所做的那样。@PabloCibraro嗨,那个链接已经死了。