2012-06-12 114 views
5

Web api似乎只適用於標準用例。 但我想做更復雜的路由,但找不到複雜路由的文檔。 如果我有更多的控制器,路由會變得越來越複雜。ASP.NET 4 MVC Web API:複雜路由的文檔

我可以用依賴性定義幾個可選參數嗎? 像這樣:

/api/document/{par1}/{par2} 

PAR1 & par2的應該是可選的,但應該PAR2 PAR1是否存在只匹配。

而遞歸參數可能嗎?

/api/documents/characteristics/{round/green/red-dots} 
/api/documents/characteristics/{square/yellow} 
/api/documents/characteristics/{square/yellow/flat} 
/api/documents/characteristics/{square/yellow/flat/...} 

有沒有web api路由的詳細文檔?微軟的教程太簡單了...... 我需要更多關於路由的信息。

我有兩個控制器和一些麻煩,因爲兩個路由非常相似,所以採取了錯誤的路線。我可以使用[動作] - 屬性作爲解決方法,但這種感覺不正確...我也必須考慮路線的順序。這是合乎邏輯的,但沒有提到。 Web api僅適用於簡單的休息API嗎?


編輯: 我嘗試這樣做:

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

//routes.MapHttpRoute(
// name: "DefaultApiWithAction", 
// routeTemplate: "api/{mandant}/documents/{id}/{action}", 
// defaults: new { controller = "documents" } 
// ); 

我有兩種方法:

[AcceptVerbs("get")] 
public HttpResponseMessage Get(int id) 

[ActionName("file")] 
[AcceptVerbs("get")] 
public HttpResponseMessage filedownload(int id) 

現在我有問題,該文件的動作被觸發,即使我註釋掉第二條路線和正常的獲取特定的文檔方法不會被觸發,因爲多個動作...我嘗試了[NoAction]屬性,但是這個我s不工作... 但是,如果route-template中沒有任何操作,爲什麼會觸發file-method? (或者如果第二條路線是活動的,爲什麼正常的get-document方法不會被觸發,如果網址中沒有動作......) 我目前的解決方法是爲所有其他方法設置默認行爲,但這不是一個好的解決方案。

回答

8

您可以使用路由限制設置路由的條件在Global.asax中,如:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"\d+" } 
); 

在最後一個參數,你可以指定有指定的參數進行匹配的路線是正則表達式用過的。在上述par1的例子僅用於數字,但你可以使用任何正則表達式,如:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"(value1|value2|value3)" } 
); 
+0

設置控制器的靜態默認應該處理的路線衝突。你可以使用約束對我來說是新的。謝謝。一個好的web api路由的微軟文檔將會很棒。我還發現你可以使用*作爲catch-all參數,像這樣{* param},但它必須在url的末尾。 – user437899

+2

我發現了asp.net路由的通用文檔:http://msdn.microsoft.com/en-us/library/cc668201.aspx – user437899