2015-09-05 27 views
1

我用下面的GET請求來查詢以下網站API控制器,的Web API控制器 「執行多個操作發現」

/API /記錄aasdfsdf - ?在記錄返回一切

/API /記錄?search = aasdfsdf - 引發以下錯誤:

"Multiple actions were found that match the request: \r\nGetRecords

是否有人能夠解釋可能的原因?

public IQueryable<Record> GetRecord() 
    { 
     // return db.Records; 
    } 


    public IQueryable<Record> GetRecord(String search) 
    { 
     // return db.Record; 
    } 

    public IQueryable<Ecg> GetEcgs(String search,DateRange date) 
    { 
     // return db.Record; 
    } 

    public class DateRange 
    { 
     public DateTime start { get; set; } 
     public DateTime end { get; set; } 
    } 

而且這將是查詢正確的方法:

public IQueryable GetEcgs(String search,DateRange date)

我試過以下,但我得到同樣的「多個動作」的錯誤。任何幫助將非常感激。

/api/records?search=asdfsdf?start=2014-09-05%2014:02:17.757&end=2014-09-05%2014:02:17.757

回答

0
/api/records?aasdfsdf 

該請求將路線GetRecord()方法,因爲您的查詢字符串沒有任何鍵值對,這樣的唯一可能途徑是GetRecord()

/api/records?search=aasdfsdf 

這個請求可以路由到GetRecord(字符串搜索)和GetEcgs(字符串搜索,日期範圍日期),日期爲空。這就是你有這個例外的原因。

您可以將控制器更改爲以下,以獲得您所需要的路由:

public IQueryable<Record> GetRecord() 
{ 
    // return db.Records; 
} 

public object GetRecord(String search, DateTime? start, DateTime? end) 
{ 
    if(start.HasValue && end.HasValue) 
    { 
     return this.GetEcgs(search, new DateRange(start,end)); 
    } 

    return this.GetRecord(search); 
} 

//use private so it's not a possible route or use [NonAction] 
private IQueryable<Record> GetRecord(String search) 
{ 
    // return db.Record; 
} 

private IQueryable<Ecg> GetEcgs(String search, DateRange date) 
{ 
    // return db.Record; 
} 

如果心電圖和記錄都是相同的基類,你可以返回IQueryable的<的BaseClass>,而不只是反對。在我們的Web API項目,我們不使用控制器返回兩種不同類型或者我們使用IHttpActionResult這樣的:

public IHttpActionResult GetRecord() 
{ 
    // return this.Ok(db.Records); 
} 

public IHttpActionResult GetRecord(String search, DateTime? start, DateTime? end) 
{ 
    if(start.HasValue && end.HasValue) 
    { 
     return this.GetEcgs(search, new DateRange(start,end)); 
    } 

    return this.GetRecord(search); 
} 

//use private so it's not a possible route or use [NonAction] 
private IHttpActionResult GetRecord(String search) 
{ 
    // return this.Ok(db.Record); 
} 

private IHttpActionResult GetEcgs(String search, DateRange date) 
{ 
    // return this.Ok(db.Record); 
} 

這種感覺不是回到「對象」好得多,但如果你有自定義過濾器將運行在控制器之後,您需要返回對象而不是結果,因此您的使用情況會有所不同。

相關問題