2011-12-10 125 views
0

這可能是一個愚蠢的問題..但到底是什麼,我有點難倒和沮喪。WCF WebAPI路由

我正在嘗試向我的應用程序添加一個REST服務。我想支持兩種具有可選參數的GET類型。

在全球ascx我有;

routes.Add(new ServiceRoute("api/userstats", new HttpServiceHostFactory() { Configuration = config }, typeof(RESTService.APIs.UserStatsAPI))); 

然後在那個控制器中我有;

[WebGet(UriTemplate = "{userguid}")] 
    public IQueryable<UserStat> Get(string userguid) 
    { 
     return null; 
    } 

    [WebGet(UriTemplate = "{userguid}/{genericstatid}")] 
    public IQueryable<UserStat> Get(string userguid, int genericstatid) 
    { 
     return null; 
    } 

所以,基本上你可以查詢一個用戶的所有統計數據,或者只是一個特定類型的統計數據。當我嘗試運行該應用時,它會抱怨,因爲我有兩個GET定義。

不能有兩個操作在具有相同名稱相同的合同,

我可以理解爲什麼,但我不知道如何解決它。如果是MVC,我會定義不同類型的路由,但我不確定如何在服務路由中完成此操作。

感謝您的任何幫助。我要去喝杯咖啡,看看是否有幫助。

回答

0

我解決了這個問題在這裏,這實際上是我自己的缺乏理解,我認爲方法名稱是隱含的行動類型,即一個webget必須被稱爲GET。事實並非如此,只要你有WebGet,你可以調用方法名稱來改變參數,就像上面Alexander的例子一樣。我的下面;

[WebGet(UriTemplate = "{userid}")] 
     public IQueryable<UserStat> Get(int userid) 
     { 

[WebGet(UriTemplate = "{userid}/{genericstatid}")] 
     public IQueryable<UserStat> GetWithID(int userid, int? genericstatid) 
     { 
1

您是否試過只留下最後一種方法進行修改?

[WebGet(UriTemplate = "{userguid}/{genericstatid}")] 
public IQueryable<UserStat> Get(string userguid, int? genericstatid) 
{ 
    if (genericstatid.HasValue) 
    { 
     // looking at one 
    } 
    else 
    { 
     // looking at all. 
    } 
    return null; 
} 

UPDATE:

這裏是我的代碼,其中有一個同名操作的例子,但使用不同的參數:

/// <summary> 
    /// Gets the javascript representation of important enumerations 
    /// </summary> 
    /// <returns></returns> 
    [OperationContract, WebGet(UriTemplate = "get/javascriptEnums.js")] 
    Stream GetEnumsJavascriptRegistration(); 

    /// <summary> 
    /// Gets some file from server 
    /// </summary> 
    /// <param name="fileName">The name of the file to return</param> 
    /// <returns></returns> 
    [OperationContract, WebGet(UriTemplate = "get/{*fileName}")] 
    Stream Get(string fileName); 
+0

這是一個很好的觀點!我現在就放棄它。回來一秒鐘。 :) – philbird

+0

這似乎不起作用,因爲它期望至少有兩個參數,所以它提供了一個404.我認爲可能爲操作添加一個名稱,但我還沒有發現。也許我應該使用參數而不是ID ......但對我來說這似乎是一個常見的要求,所以很奇怪,它證明如此困難。 – philbird

+0

我用我的項目中的代碼更新了答案 –