2014-03-24 90 views
0

我使用ASP .NET Web Api創建了一個restful api,我在設置路由時遇到了問題。路由不能按預期工作

問題1:我正在嘗試設置自定義刪除路線。如果我在我的控制器「DeleteTargetFromApplication」上命名我的操作,它可以很好地工作,但如果我將操作命名爲「RemoveTargetFromApplication」,它會給我一個「請求的資源不支持http方法'DELETE'」錯誤。除了名字,我什麼都不改變。我使用的路線是這樣設置的:

config.Routes.MapHttpRoute(
       name: "PesticideRemoveTargetFromApplication", 
       routeTemplate: "Pesticide/Applications/{id}/Targets/{targetId}", 
       defaults: new { controller = "Applications", action = "DeleteTargetFromApplication" }, 
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) } 
      ) 

有沒有我沒有得到關於Web Api如何匹配路線?

問題2:我有Get,Post,Put,Delete,Patch的所有默認路由。在默認值上面,我在上面創建了默認設置的任何特殊路由。出於某種原因,當我添加:

config.Routes.MapHttpRoute(
       name: "PesticideGetTargetsForApplication", 
       routeTemplate: "Pesticide/Applications/{id}/Targets", 
       defaults: new { controller = "Applications", action = "GetTargetsForApplication" }, 
       constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
      ); 

默認值以上,這是說我有匹配的「GetTargetsForApplication」行動和默認的「獲取」行動我把所有控制器上兩個動作。爲什麼看到這兩種行爲,即使我具體告訴它要使用哪個動作。路線模板明顯不同於「Applications /:id/Targets」和「Applications」。爲什麼這些混合起來?

+0

我已編輯您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

在問題1:

路由引擎是基於慣例和從方法(作用)名確定的允許HTTP謂詞。這就是爲什麼DeleteTargetFromApplication有效。

一個簡單的解決方法是將[HttpDelete]添加到RemoveTargetFromApplication的定義中。

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

要查找的動作,網絡API着眼於HTTP方法,然後尋找一個動作名稱以該HTTP方法名。例如,通過GET請求,Web API將查找以「Get ...」開頭的操作,例如「GetContact」或「GetAllContacts」。此慣例僅適用於GET,POST,PUT和DELETE方法。您可以通過使用控制器上的屬性來啓用其他HTTP方法。我們稍後會看到一個例子。

0

我想我已經想通了。問題是,當我調用Pesticide/Applications /:id/Targets url時,它正在工作,但任何其他GET都變得困惑,並且它與上面的答案有關。它正在檢查以「Get」開頭的任何操作,並且具有類似的簽名並且找到了多個操作。我所做的是向我的默認路由添加「Get」的默認操作,以便它僅在默認路由上使用該特定操作。它帶走了web api路由匹配的一小部分功能,但它允許在同一控制器中分離類似但具有不同名稱的動作