2012-07-12 31 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

相关问题