2

我有一个路由问题,我不知道如何解决它。

有一个名为“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"
                }
            );

但这没有帮助。

在网上看了很多关于路由表的帖子后,我不确定是否有可能有两个具有相同签名但名称不同的操作。

任何人都可以帮忙吗?

谢谢,艾迪。

4

1 回答 1

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 中。

于 2012-07-12T17:23:11.817 回答