0

我的ASP.NET Web API啓用2.1項目與屬性的路由和控制器動作裝飾如下:如何在Web API屬性調用中支持「常規」和「可讀」URL?

[Route("api/product/barcode/{barcodeType}/{barcode}")] 
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria) 

其中BarcodeSearchCriteria是一個複雜的類型:

public class BarcodeSearchCriteria 
{ 
    public string Barcode { get; set; } 

    public string BarcodeType { get; set; } 
} 

它非常適用一「常規」的網址是這樣的:

/api/product/barcode/EAN/0747599330971 

但如何在同一時間支持URL是這樣的:

/api/product/barcode/?barcodeType=EAN&barcode=0747599330971 

我以前在我的* .webtest中使用它,然後切換到「可讀」模式。

回答

1

你可以在這種情況下,2條路線:

[Route("api/product/barcode")] //expects values from query string 
[Route("api/product/barcode/{barcodeType}/{barcode}")] //expects value from route 
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria) 
+0

它似乎用來工作,但在一段時間前停止工作。現在我得到的是相同的錯誤:「控制器'產品'找不到匹配請求的操作」。當配置了1(默認)或2(也包含動作)路由時。 – abatishchev

+0

嗯..這應該工作...確保你的屬性路由已經在你的配置中的常規路由之前註冊了。這是因爲任何匹配傳統路由的請求都無法達到屬性控制器/操作。 –

+0

我的錯誤是在路線註冊順序。謝謝! – abatishchev

0

它看起來像沒有路由定義爲正常的URL與查詢字符串參數。

嘗試使路線參數如此可選。

[Route("api/product/barcode/{barcodeType=""}/{barcode=""}")] 
public async Task<IHttpActionResult> GetProduct([FromUri] BarcodeSearchCriteria searchCriteria) 

所以它也應該匹配路線模板api/product/barcode路線。

還沒有測試,但希望你明白了我的觀點。

+0

我仍然得到一個錯誤:「沒有行動上的控制器‘產品’與請求匹配的發現。」即使有'ute(@「api/product/barcode/{barcodeType =」「」「}/{barcode =」「」「}」)]' – abatishchev

+0

谷歌也沒有提供建議如何正確指定字符串參數的默認值 – abatishchev

+1

你是對的,是否有可能裝飾雙重路線屬性對同一行動,即添加[路徑(「API /產品/條碼」)]也刪除可選修飾後的第二個屬性相同的方法。 – ssilas777

相關問題