1

我正在嘗試將AttributeRouting添加到我的WebAPI項目中。如何用查詢字符串指定路由?

在一個控制器我目前有定義的三個GET方法:

[GET("dictionaries")] 
public IEnumerable<Dictionary> Get() 

[GET("dictionaries/{id}")] 
public Dictionary GetByID(int id) 

[GET("dictionaries/{dictionaryID}/{page}")] 
public Dictionary Browse(long dictionaryID, int page) 

前兩個路由工作,我希望他們能,但第三始終返回405不允許的方法

我試着發送URL中的參數和查詢字符串,並且它們都是相同的響應。當我試着查詢字符串的版本,我已經修改了路線是

[GET("dictionaries?dictionaryID={dictionaryID}&page={page} 

我也試着改變從dictionaries初始字dictionary,以避免與其他兩個GET航線任何含糊之處,但仍然沒有成功。

documentation for AttributeRouting只提及與參數約束(由於WebHost框架而不適用於我)的查詢字符串,並未提及查詢字符串如何用於路由。

任何人都可以告訴我如何使用這兩個參數來實現第三條路線,還是必須放棄AttributeRouting或嘗試使用它自己的控制器?

回答

1

Web API動作選擇器隱含地認爲這裏的第三個動作是一個POST,因爲它不以GET,POST,PUT等動詞開頭。嘗試添加HttpGet屬性,看看它是否有效。

[HttpGet, GET("dictionaries/{dictionaryID}/{page}")] 
public Dictionary Browse(long dictionaryID, int page) 
+0

謝謝基蘭,現在完美的工作。我認爲AttributeRouting的GET屬性允許我刪除WebAPI的HttpGet屬性 - 該GET取代了HttpGet - 但顯然這不是真的。 – awj

+0

這是AR的一個已知問題。 * IActionHttpMethodProvider *在Web API RTM中是內部的,這在這裏引起了問題。在Web API vNext中,它已被更改爲public,所以一旦發佈,就不再需要這個雙重聲明。更多信息https://github.com/mccalltd/AttributeRouting/issues/83 –