如何使用多个收集参数正确地重载WebAPI 2控制器?

时间:2015-05-06 02:34:50

标签: c# asp.net rest asp.net-web-api

我正在尝试使用重载的Get方法设计我的WebAPI控制器,这些方法将根据用户提供的参数进行选择。在某些情况下,我能够正常工作,但是当我在方法上有多个收集参数时,我的控制器不再能够选择正确的路径,即使我没有指定两个集合。

例如,以下设置有效:

q = 0
while q < len(list1): 
   code_to_be_executed 
   q = q+1

选择方法1

获取http://server/data/stock/?symbols[]=GOOG&symbols[]=MSFT

选择方法2

获取http://server/data/stock/?symbols[]=GOOG&symbols[]=MSFT&time=2015-01-01

一旦我添加了以下重载,那么一切都会崩溃:

[RoutePrefix("data/stock")]
public class StockDataController 
    : ApiController {

    private readonly IDataProvider<StockDataItem> _dataProvider;

    public StockDataController() {
        _dataProvider = new StockDataProvider();
    }

    [Route("")]
    public IEnumerable<StockDataItem> Get([FromUri] string[] symbols) {
        // Return current stock data for the provided symbols
    }

    [Route("")]
    public IEnumerable<StockDataItem> Get([FromUri] string[] symbols, DateTime time) {
        // Return stock data at a specific time for the provided symbols
    }

}

我希望以下请求选择方法3:

获取http://server/data/stock/?symbols[]=GOOG&symbols[]=MSFT&fields[]=Price&fields[]=Volume

相反,我收到错误:

  

找到了与请求匹配的多个操作:Get on type   StockDataController获取类型StockDataController

这样可以有多个收集参数吗?如果是这样,我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要在REST服务中使用可选参数。

只需将你的时间变量用作nulleable:DateTime?时间

public IEnumerable<StockDataItem> Get([FromUri] string[] symbols, DateTime? time) {
    // Return stock data at a specific time for the provided symbols
}

现在您可以将您的服务称为:

获取http://server/data/stock/?symbols[]=GOOG&symbols[]=MSFT

获取http://server/data/stock/?symbols[]=GOOG&symbols[]=MSFT&time=2015-01-01