如何使用ASP.Net WebApi重载方法?

Sri*_*ddy 5 c# asp.net put asp.net-web-api

我遇到一种情况,我有两种方法,一种在我的控制器类中接受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);
}
Run Code Online (Sandbox Code Playgroud)

我的路由表如下所示:

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
                    });
Run Code Online (Sandbox Code Playgroud)

这按预期工作。但是我想到了重构代码以尝试重载。我试图重载控制器中的方法,只有一条路由,但失败并显示500错误-无效请求。我以为webapi将通过验证参数来解决调用-如果它是一个列表,则它将使用list作为参数调用重载方法,否则将调用另一个方法。我打算做类似的事情:

[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);
}
Run Code Online (Sandbox Code Playgroud)

我的路由表如下所示:

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

Jim*_*ley 1

我怀疑路由没有考虑到正文。在您的情况下,确定使用哪个重载的唯一方法是解析正文并适当地路由。您可以做的一种简化是始终使用单一方法获取 Item 列表。然后,如果是单个项目,只需在列表中包含该项目即可。