如何与ASP.Net的WebAPI重载方法的工作? [英] How to work with ASP.Net WebApi overloaded methods?
问题描述
我有一个情况我有以下两种方法之一接受POCO,在我的控制器类POCO的另一个列表:
的[AcceptVerbs(PUT)]
[ActionName(项目)]
公共无效SaveItem([FromBody]项目项)
{
m_controller.SaveItem(项目);
}的[AcceptVerbs(PUT)]
[ActionName(项目)]
公共无效SaveItems([FromBody]列表<项目>的项目)
{
m_controller.SaveItem(项目);
}
我的路由表看起来是这样的:
routes.MapHttpRoute(项目路线
API /项目/ {}订单ID,
新
{
控制器=MyOrder
行动=项目,
订单ID = RouteParameter.Optional
});routes.MapHttpRoute(项目路线,
API /项目/ {}订单ID,
新
{
控制器=MyOrder
行动=项目,
订单ID = RouteParameter.Optional
});
这正常工作。但我认为重构code尝试超载。我试图重载在我的控制器的方法和只有一个途径,但它失败,500错误 - 无效请求。我以为的WebAPI将通过验证的参数解析呼叫 - 如果它是一个列表,然后它会调用重载方法与列表作为参数,否则其他的方法。我正打算做这样的事情:
的[AcceptVerbs(PUT)]
[ActionName(项目)]
公共无效SaveItem([FromBody]项目项)
{
m_controller.SaveItem(项目);
}的[AcceptVerbs(PUT)]
[ActionName(项目)]
公共无效SaveItem([FromBody]列表<项目>的项目)
{
m_controller.SaveItem(项目);
}
我的路由表看起来是这样的:
routes.MapHttpRoute(项目路线
API /项目/ {}订单ID,
新
{
控制器=MyOrder
行动=项目,
订单ID = RouteParameter.Optional
});
网页API使用一种叫IHttpActionSelector确定在控制器调用哪个动作。我觉得默认的实现不支持重载这样的场景。您可以实现自定义IHttpActionSelector,但它可能大量的工作。看看样品在这个博客帖子,
<一个href=\"http://www.novanet.no/blog/aanund-austrheim/dates/2012/7/several-post-methods-on-an-apicontroller-using-an-actionselector/\" rel=\"nofollow\">http://www.novanet.no/blog/aanund-austrheim/dates/2012/7/several-post-methods-on-an-apicontroller-using-an-actionselector/
这将是更简单,支持一个单一的场景,你总是收到项目清单。对于一个项目的情况下,它只是一个单一的项目列表。
I have a situation where I have two methods one accepts a poco and another list of poco in my controller class:
[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);
}
my routing table looks something like:
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
});
This works as expected. But I thought of refactoring the code to try overloading. I tried to overload the methods in my controller and have just one route but it failed with 500 error - Invalid Request. I thought webapi will resolve the call by verifying the parameter - if it is a list then it will call the overloaded method with list as parameter otherwise the other method. I was planning to do something like:
[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);
}
my routing table looks something like:
routes.MapHttpRoute("Item Route",
"api/item/{orderId}",
new
{
controller = "MyOrder",
action = "Item",
orderId = RouteParameter.Optional
});
Web API uses something called IHttpActionSelector to determine which action to invoke in the controller. I think the default implementation does not support overloads for scenarios like this. You can implement a custom IHttpActionSelector, but it might a lot of work. Take a look at the samples in this blog post,
It would be much simpler to support a single scenario where you always receive a list of items. For the case of one item, it's just a list with a single item.
这篇关于如何与ASP.Net的WebAPI重载方法的工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!