2012-07-12 29 views
2

我有一個路由問題,我無法弄清楚如何解決它。只能使用不同名稱的函數可以使用Web api路由嗎?

有一個名爲「UsersController」控制器,它包含2 POST操作功能:

public int PostFBLogin(User userObject){} 
public void PostUpdateImgUrl(User userObject){} 

當我做一個POST請求,我通過「用戶」的JSON表示請求體。 如果我註釋掉其中一個函數,那麼它工作正常。 但是當兩種功能存在,每當我試圖讓他們中的每一個要求,我得到以下錯誤:

"Multiple actions were found that match the request: 
Int32 PostFBLogin(MestoryServer.Models.User) on type MestoryServer.Controllers.UsersController 
Void PostUpdateImgUrl(MestoryServer.Models.User) on type MestoryServer.Controllers.UsersController" 

我試圖通過將以下途徑在路由表來解決這個問題:

  RouteTable.Routes.MapHttpRoute(
       name: "UserPostUpdateImgUrlAction", 
       routeTemplate: "api/users/PostUpdateImgUrl/", 
       defaults: new 
       { 
        controller = "users", 
        action = "PostUpdateImgUrl" 
       } 
      ); 

      RouteTable.Routes.MapHttpRoute(
       name: "UserPostFBLoginAction", 
       routeTemplate: "api/users/PostFBLogin/", 
       defaults: new 
       { 
        controller = "users", 
        action = "PostFBLogin" 
       } 
      ); 

但它沒有幫助。

看了很多關於互聯網路由表的帖子後,我不確定甚至有可能有兩個具有相同簽名但名稱不同的操作。

任何人都可以幫忙嗎?

謝謝, Edi。

回答

1

當您使用Web API發出HTTP請求時,HTTP方法用於標識要調用的操作。 HTTP Post請求將調用ApiController中以「POST」開頭的方法。按照慣例,Web API預計(至多)每個HTTP方法有一個方法。這是您收到錯誤的原因。

的Web API的默認路由沒有指定動作:

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

你可以改變上面,包括動作,例如routeTemplate: "api/{controller}/{action}/{id}"但是你必須在方法之上添加[HttpPost]

或者你可以考慮將你的Web Api控制器分成兩部分。 PostFBLogin方法可以移入LoginController,PostUpdateImgUrl方法可以留在UsersController中。

+0

所以現在我試圖使用以下路由: RouteTable.Routes.MapHttpRoute(name:「ActionApi」,routeTemplate:「api/{controller}/{action}/{id}」,默認值:new {id = RouteParameter.Optional} ); 我也把[HttpPost]放在兩個函數上。但我仍然得到同樣的錯誤。 – Edi 2012-07-12 22:26:25

+0

這應該工作。這可能是由路線衝突造成的。您是否添加了新路線而不是更改默認路線?在這種情況下,需要在沒有采取行動的路線之前指定具有行動的路線。 – Martin4ndersen 2012-07-13 06:33:38

+0

太棒了!現在它工作了! 實際上在Application_Start中沒有任何DefaultApi路由。它已經在路由列表中。所以我不得不在列表中的DefaultApi路由之前插入新路由 - 就像你說的那樣。 – Edi 2012-07-13 06:51:52

相關問題