簡體   English   中英

值類型不同的WebAPI控制器方法

[英]WebAPI Controller Methods that Differ By Value Types

我有一個現有的API,現在我要移至WebAPI,因此不能隨意更改URL。 打破現有客戶不是我的選擇。

知道這一點,原始API將為給定的操作方法接受Guid(ID)或字符串(名稱)。 舊的API處理程序將破譯URL參數,並將請求發送到旨在接受給定參數類型的控制器操作。

舉個例子:

Get(Guid id)

Get(string name)

使用WebAPI時,參數綁定在值類型之間是貪婪的,因此,取決於哪個是控制器源文件中的第一個,該操作是被調用的操作。 對於我的需求,那是行不通的。 我希望活頁夾將意識到無法將Guid轉換為名稱,然后選擇更通用的基於字符串的操作。 沒有骰子。 Guid只是作為一個空值出現(有趣的是,因為它是一個值類型,但這就是我在處理過程中的某個時刻在調試器中得到的結果)。

所以我的問題是如何最好地處理這個問題? 我是否需要實現自定義IHttpActionSelector? 我嘗試了使用屬性路由方法(帶有約束),但是這種方法不太正確(因為看起來很酷,所以更加笨拙)。 WebAPI中有一種機制可以解決我尚不知道的問題嗎? (我知道我可以通過測試字符串的Guidness並調用其他控制器方法來破解它,但我希望有一個更優雅的基於WebAPI的解決方案...)

我花了很多時間嘗試將基於屬性的路由放入其中,但是我還沒有開始工作。 但是,我確實使用路由約束解決了我的特定問題。 如果您首先注冊更受約束的路由,則WebAPI(如MVC)將應用約束並跳過受更約束的路由,直到找到可以選擇的路由(如果有)。

因此,以我的示例為例,我將這樣設置路由:

_config.Routes.MapHttpRoute(name: "ById",
    routeTemplate: "product/{id}",
    defaults: new { controller = "ProductDetails" },
    constraints: new { id = @"^\{?[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\}?$" });
_config.Routes.MapHttpRoute(name: "ByName",
    routeTemplate: "product/{name}",
    defaults: new { controller = "ProductDetails" });

第一條路線接受Guid正則表達式形式的約束。 第二個接受所有其他值,控制器將處理非產品名稱(返回404)。 我在自托管的WebAPI服務器上對此進行了測試,並且效果很好。

我確信基於屬性的路由會更優雅,但是在我開始使用它之前,它為我路由了舊方法。 至少我找到了一個合理的基於WebAPI的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM