基于数组参数类型的通用webAPI方法

时间:2015-06-08 18:10:37

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

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

我有一些像这样的代码

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

现在我得到这个ExceptionMessage

  

" ExceptionMessage":"发现多个匹配的动作   请求"

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

我的假设是我将不得不这样做,因为如果我从URI发送数据我可以发送所有Ints,但如果这些int意图转到字符串方法或int方法则不会。我只是想问一下是否有一种首选方式而不是将它们放在单独的控制器中,但这种情况似乎是交易破坏者。

继承人我正在使用的网址

顶部方法的

url 1

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

url 2代表底层方法

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

2 个答案:

答案 0 :(得分:1)

我认为您对重载的理解可能略有不同。但是,您可以使用Generics完成上述操作。

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

答案 1 :(得分:0)

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

  1. 使用attribute routing,以便每个操作都有不同的网址
  2. 实现一个接收两个参数数组的简单操作,并在其中包含逻辑,以根据数组为空或具有元素来确定要运行的代码
  3. 编辑:添加样本

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

    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&nums=96&nums=55