我正試圖爲我們的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"
};
}
}
我們預計,默認的工作是這樣的:
現在開發商想改變行爲那麼他應該能夠簡單地定義與相同的路線以暗示它們的實現應該是使用的那個,而不是默認的。我最初的想法是使用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
:
,我們結束了與此異常返回的響應:
是否有可能微軟剛剛錯過的邏輯/規定使用Order
作爲路線消除歧義,這是一個錯誤?還是有另一種簡單的方法來覆蓋路線,希望有一個屬性?