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)
我怀疑路由没有考虑到正文。在您的情况下,确定使用哪个重载的唯一方法是解析正文并适当地路由。您可以做的一种简化是始终使用单一方法获取 Item 列表。然后,如果是单个项目,只需在列表中包含该项目即可。
| 归档时间: |
|
| 查看次数: |
6704 次 |
| 最近记录: |