2015-05-06 37 views
4

我試圖設計我的WebAPI控制器重載Get方法,將根據用戶提供的參數進行選擇。在某些情況下,我可以正確地工作,但是當我在一個方法上有多個收集參數時,即使我沒有指定兩個集合,我的控制器也不能再選擇正確的路由。如何正確重載WebAPI 2控制器和多個收集參數?

例如以下設置作品:

[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

GET 2

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

的方法選擇GET 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:

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

相反,我收到錯誤消息:

Multiple actions were found that match the request: Get on type StockDataController Get on type StockDataController

是否有可能有多個收集參數你的方式?如果是這樣,我在這裏做錯了什麼?

+0

你有沒有試圖消除'RoutePrefix',然後添加特定的路線('data/stock/{symbols}'和'data/stock/{symbols}/{fields}')? –

回答

2

您需要REST服務中的可選參數。

只需使用您的時間變量作爲nulleable:DateTime?時間

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

現在你可以打電話給你的服務爲:

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

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

+0

您概述的場景已經可以正常使用方法重載。我遇到的唯一問題是,當我想要做同樣的事情,但有兩個'string []''類型的參數。我知道我可以用一個方法和可選參數解決我的問題,但我試圖避免一堆'if(p1.HasValue &&!p2.HasValue)'邏輯。另外我想更多地瞭解爲什麼只有其中一個場景在兩者基本相同的情況下才起作用。 – mclark1129

+1

噢,對不起,我誤解了你的問題:( 但是,這種行爲是因爲webapi將所有參考類型參數作爲可選參數處理。[] = GOOG&symbols [] = MSFT 如果您正在調用: 'public IEnumerable Get([FromUri] string [] symbols)'或'public IEnumerable Get([FromUri] string [] =符號,[FromUri]字符串[]字段)'因爲'fields'可以是'null' 這就是爲什麼你添加新方法後得到這個異常 – qjuanp