gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:28:00 24 4
gpt4 key购买 nike

我有一种情况,我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com