【问题标题】:Web api routing possible for functions with just a different name?对于名称不同的函数,Web api 路由是否可行?
【发布时间】:2012-07-12 11:28:27
【问题描述】:

我遇到了路由问题,不知道如何解决。

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

但这并没有帮助。

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

谁能帮忙?

谢谢, 编辑。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing asp.net-web-api


    【解决方案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 中。

    【讨论】:

    • 所以现在我尝试使用以下路由:RouteTable.Routes.MapHttpRoute(name: "ActionApi",routeTemplate: "api/{controller}/{action}/{id}", 默认值:新的 { id = RouteParameter.Optional } );我还把 [HttpPost] 放在这两个函数上。但我仍然得到同样的错误。
    • 应该可以。它可能是由路由冲突引起的。您是否添加了新路由而不是更改默认路由?在这种情况下,需要在没有动作的路由之前指定有动作的路由。
    • 太棒了!现在它起作用了!实际上在 Application_Start 中没有任何 DefaultApi 路由。它已经在路由列表中。所以我不得不在列表中的 DefaultApi 路由之前插入新路由——就像你说的那样。
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 2017-09-16
    • 1970-01-01
    • 2021-04-01
    • 2018-05-28
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多