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

标签 c# asp.net asp.net-web-api put

我有一种情况,我的 Controller 类中有两种方法,一种接受 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);
}

我的路由表看起来像:

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
                    });

这按预期工作。但我想到重构代码来尝试重载。我尝试重载 Controller 中的方法,并且只有一条路由,但失败并出现 500 错误 - 无效请求。我认为 webapi 将通过验证参数来解析调用 - 如果它是一个列表,那么它将调用以列表作为参数的重载方法,否则调用其他方法。我本来打算做这样的事情:

[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 的东西来确定在 Controller 中调用哪个操作。我认为默认实现不支持此类场景的重载。您可以实现自定义 IHttpActionSelector,但这可能需要大量工作。看看这篇博文中的示例,

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

支持您始终收到项目列表的单一场景会简单得多。对于一个项目的情况,它只是一个包含单个项目的列表。

关于c# - 如何使用 ASP.Net WebApi 重载方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15813512/

相关文章:

c# - 动态创建的按钮,但为它们创建的事件未触发

c# - 将带有路径查找的单击移动添加到我当前在 Unity 中的 2D 项目

asp.net - youtube 视频上传限制

c# - 如何在 ASP.NET 5/MVC 6 中创建响应消息并向其添加内容字符串

c# - 如何处理 NUnit 中抛出的异常

c# - 如何通过键盘禁用 ListView 导航

C# 如何从此选择中使用 request.form.getvalues 获取多个值

c# - 使用 Noda Time 将奥尔森时区 ID 转换为 Windows 标准格式

c# - ASP.NET Web API 不返回 XML

c# - Asp.Net Web API ODATA 的 GROUP BY/不区分大小写扩展?