2012-05-15 72 views
2

在WCF REST中,我可以定義一個嚴格的URL模板。ASP.NET MVC Web API 4 - Complexe URL模板

在ASP.NET MVC Web API 4我有一個問題。

我註冊爲正常的路線:

routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

我的控制器有這樣的方法:

// POST /api/documents 
public HttpResponseMessage<Document> Post(Document document) 
{...} 

如果我送這個URL「http://servername.com一個POST請求: 53835/api/Documents/「(參數」1337「不應該在那裏),它調用Post(Document document)方法。但我想,框架在這種情況下顯示一個錯誤。 (例如「找不到此請求的API調用」)。

休息WCF我能嚴格配置此... 我並不熱衷這種「約定優於配置」 ......

我怎麼可以做更多的配合物的網址模板?

  • 我想是這樣的:

的GET請求與該URL模板的API: 「http://servername.com:53835/api/Documents/1337」 獲取特定的文檔對象(包含創建日期,創建者等元數據...)。

另一個GET請求應該找回的文件本身(如流),以這樣的URL: http://servername.com:53835/api/Documents/1337/File

我如何定義這種差異? 用於獲取文檔對象一開始的方法是這樣的:

// GET /api/documents/5 
public HttpResponseMessage<Document> Get(int id) 
{...} 

我如何定義具有相同的參數(在這種情況下,「ID」)一個單獨的方法?我是否必須使用WCF REST-Projects中的方法屬性來配置URL模板?

我可以編輯{動作}佔位符這樣的路由:

routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{mandant}/{controller}/{id}/{action}", 
       defaults: new { mandant = "profile", id = RouteParameter.Optional, action = RouteParameter .Optional} 
      ); 

,然後我可以使用的方法的屬性[ActionName( 「文件」)]和的[AcceptVerbs( 「GET」)]躺在這樣的:

[ActionName("File")] 
[AcceptVerbs("GET")] 
public HttpResponseMessage FileDownload(int id) 

然後我可以叫: 「http://servername.com:53835/api/Documents/1337/File」 來獲取文件。 但是如果我想要更多這些「行動」呢?

  • 一個複雜的用例將是一個帶有重複部分的URL。 類似於:(在這種情況下,我有一些項目的特點。數這一特性應變量)

http://servername.com:53835/api/Documents/characteristic_1/characteristic_2/characteristic_3 http://servername.com:53835/api/Documents/characteristic_1/characteristic_2

與特徵的部分應該是動態的/可變的。

回答

0

我也玩過這個,我發現這種方法在很多情況下可能會導致不期望的結果,並且不知何故使您的API難以使用。最適合我的是,我的API方法只有一個輸入參數,它是ID,並使用URL參數傳遞所有其他變量。

爲了避免乾燥的東西,你可以考慮寫一個ActionFilter左右。

+0

什麼是ActionFilter?我沒有發現WebApi-ActionFilter。我能用他們做什麼? – user437899