【问题标题】:Generic webAPI method based on parameter types of arrays基于数组参数类型的通用 webAPI 方法
【发布时间】:2015-06-08 18:10:37
【问题描述】:

我在 Asp.net 4.5 中有一个 webAPI。

我有一些这样的代码

    public string[] Get([FromUri] string[] filterStrings)
    {
        return filterStrings;
    }
    public int[] Get([FromUri] int[] nums)
    {
        return nums;
    }

现在我得到了这个异常消息

"ExceptionMessage": "找到了多个匹配 请求”

是否可以接受一个字符串数组,然后是一个数组 int,并在同一个控制器中调用不同的方法,还是我需要在不同的控制器中执行这两个不同的操作?

我的假设是我必须稍后再做,因为如果我从 URI 发送数据,我可以发送所有 Ints,但如果这些 int 是为了转到 string 方法或 int 方法,则不会。我只是想问是否有首选的方法,而不是将它们放在单独的控制器中,但这种情况似乎是交易破坏者。

这是我正在使用的网址

顶部方法的 url 1

http://localhost:7656/api/SearchAll?filterStrings=Tebow&filterStrings=Tim&filterStrings=11

ints的底部方法的url 2

http://localhost:7656/api/SearchAll?nums=11&nums=96&nums=55

【问题讨论】:

  • 拜托,你能显示你正在测试操作的 URL 吗?
  • @JotaBe 编辑了我原来的帖子,为什么会这样?

标签: asp.net .net generics asp.net-web-api


【解决方案1】:

我认为您对重载的理解可能略有偏差。但是,您可以通过使用泛型来完成上述操作。

public static T[] Get<T>([FromUri] T[] t)
{
    T[] result = new T[count]; // count being size of your array
    // do something
    return result;
}

【讨论】:

  • +1 你的权利我在想它的正确术语是什么,然后想到了重载方法,但事实并非如此。感谢有一段时间没有使用泛型了,这似乎是在正确的轨道上。
  • 还没有,我简要地看了它,但几天后我正在与实体框架搏斗
【解决方案2】:

这看起来像是 Web API 无法根据参数名称选择操作的极端情况。也许是因为数组有些可选(它可以是空的,所以从技术上讲,发布其他参数会产生一个空数组,而不是缺少的参数)。对于这个问题,我可以找到两个更简单的解决方案:

  1. 使用attribute routing,让每个动作都有不同的URL
  2. 实现一个接收两个参数数组的简单操作,并在其中包含根据数组为空或包含元素来确定运行哪些代码的逻辑

编辑:添加示例

此示例代码适用于问题中的两个 URL:

public string[] Get([FromUri] int[] nums, [FromUri] string[] filterStrings)
{
    if (nums.Length > 0)
    {
        return nums.Select(n => n.ToString()).ToArray();
    }
    if (filterStrings.Length > 0)
    {
        return filterStrings;
    }
    throw new HttpException("Missing parameters!");
}

我没有包含属性路由的示例,因为您必须考虑上面链接中完美解释的几件事,例如注册属性路由等。在这种情况下,您需要为操作添加属性,并且您需要使用不同的 URL 来调用它们,例如:/api/SearchAll/ByNumber/?nums=11&amp;nums=96&amp;nums=55

【讨论】:

  • 很棒的帖子效果很好,当我有机会时,还需要深入研究属性路由。不知道为什么有人对你投了反对票,但即使是现在。
猜你喜欢
  • 2022-11-04
  • 2019-09-02
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2018-08-10
  • 1970-01-01
相关资源
最近更新 更多