2014-11-05 74 views
0

我正試圖爲我們的REST API開發團隊標準化一個擴展模型。我們需要提供路由的默認實現,同時允許自定義路由替代默認實現。如何覆蓋web api路由?

舉個簡單的例子,如果我們有一個GET路線api/users這樣的:

public class DefaultUsersController : ApiController 
{ 
    [HttpGet] 
    [Route("api/users", Order = 0)] 
    public IEnumerable<string> DefaultGetUsers() 
    { 
     return new List<string> 
     { 
      "DefaultUser1", 
      "DefaultUser2" 
     }; 
    } 
} 

我們預計,默認的工作是這樣的:

enter image description here

現在開發商想改變行爲那麼他應該能夠簡單地定義與相同的路線以暗示它們的實現應該是使用的那個,而不是默認的。我最初的想法是使用Order property on the Route attribute,因爲這似乎是爲了在發現模糊路線時提供優先級(按升序)的方式。但是它不工作這種方式,認爲我們要覆蓋默認api/users路徑的自定義實施:

public class CustomUsersController : ApiController 
{ 
    [HttpGet] 
    [Route("api/users", Order = -1)] 
    public IEnumerable<string> CustomGetUsers() 
    { 
     return new List<string> 
     { 
      "CustomUser1", 
      "CustomUser2" 
     }; 
    } 
} 

通知Order屬性設置爲-1給它比默認的,這是一個較低的優先級值設置爲0.我本以爲這會被DefaultHttpControllerSelector使用,但事實並非如此。從DefaultHttpControllerSelector

enter image description here

,我們結束了與此異常返回的響應:

​​

是否有可能微軟剛剛錯過的邏輯/規定使用Order作爲路線消除歧義,這是一個錯誤?還是有另一種簡單的方法來覆蓋路線,希望有一個屬性?

回答

0

我有幾乎相同的問題。我創建了一個初學者網站,但我希望用戶能夠重新定義控制器的行爲,特別是如果有錯誤。

我使用Autofac來解析控制器,但即使當我將新控制器註冊爲舊控制器時,原來的控制器也會被選中。

我要做的可能是去URL重寫。特別是因爲這個問題對我而言是暫時的。不過,如果有人有更好的選擇,我會感興趣。