如何与ASP.Net的WebAPI重载方法的工作? [英] How to work with ASP.Net WebApi overloaded methods?

查看:1555
本文介绍了如何与ASP.Net的WebAPI重载方法的工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个情况我有以下两种方法之一接受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,

http://www.novanet.no/blog/aanund-austrheim/dates/2012/7/several-post-methods-on-an-apicontroller-using-an-actionselector/

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆