【问题标题】:How can I properly overload a WebAPI 2 Controller with multiple collection parameters?如何正确重载具有多个集合参数的 WebAPI 2 控制器?
【发布时间】:2015-05-06 10:58:26
【问题描述】:

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

例如以下设置有效:

[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
    }

}

选择方法 1

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

选择方法2

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

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

    [Route("")]
    public IEnumerable<dynamic> Get(
        [FromUri] string[] symbols, [FromUri] string[] fields) {
        // Return specified stock data fields for the specified symbols
    }

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

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

相反,我收到了错误:

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

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

【问题讨论】:

  • 您是否尝试过删除RoutePrefix,然后将特定路由添加到操作(data/stock/{symbols}data/stock/{symbols}/{fields})?

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


【解决方案1】:

您的 REST 服务中需要一个可选参数。

只需将您的时间变量用作可空值: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

【讨论】:

  • 您概述的场景已经使用方法重载正常工作。我遇到的唯一问题是当我想做同样的事情但有两个string[] 类型的参数时。我知道我可以用一个方法和可选参数来解决我的问题,但我试图避免一堆if(p1.HasValue &amp;&amp; !p2.HasValue) 逻辑。此外,我想更多地了解为什么只有一个场景在基本相同的情况下有效。
  • 哦,对不起,我误解了你的问题 :( 但这种行为是因为 webapi 将所有引用类型参数视为可选参数。所以,如果你调用:GET server/data/stock/?symbols[] =GOOG&symbols[]=MSFT 无法理解你是否正在调用:public IEnumerable&lt;string&gt; Get([FromUri] string[] symbols)public IEnumerable&lt;dynamic&gt; Get([FromUri]string[] symbols, [FromUri] string[] fields) 因为fields 可以是null 这就是为什么在添加新方法后会出现此异常
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多