一尘不染

Web API控制器中的多个HttpPost方法

c#

我开始使用MVC4 Web API项目,我有多种HttpPost方法的控制器。控制器如下所示:

控制者

public class VTRoutingController : ApiController
{
    [HttpPost]
    public MyResult Route(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }

    [HttpPost]
    public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }
}

这里MyRequestTemplate代表负责处理请求中的Json的模板类。

错误:

当我使用Fiddler发出请求时,http://localhost:52370/api/VTRouting/TSPRoute或者http://localhost:52370/api/VTRouting/Route
出现错误:

找到多个符合要求的动作

如果我删除上述方法之一,则可以正常工作。

Global.asax

我尝试修改中的默认路由表global.asax,但仍然出现错误,我认为在global.asax中定义路由时遇到问题。这是我在global.asax中所做的事情。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapHttpRoute(
        name: "MyTSPRoute",
        routeTemplate: "api/VTRouting/TSPRoute",
        defaults: new { }
    );

    routes.MapHttpRoute(
        name: "MyRoute",
        routeTemplate: "api/VTRouting/Route",
        defaults: new { action="Route" }
    );
}

我正在使用POST在Fiddler中发出请求,在RequestBody中为MyRequestTemplate传递json。


阅读 728

收藏
2020-05-19

共1个答案

一尘不染

您可以在一个控制器中执行多个操作。

为此,您必须执行以下两项操作。

  • 首先用ActionName属性装饰动作

     [ActionName("route")]
    

    public class VTRoutingController : ApiController
    {
    [ActionName(“route”)]
    public MyResult PostRoute(MyRequestTemplate routingRequestTemplate)
    {
    return null;
    }

    [ActionName(“tspRoute”)]
    public MyResult PostTSPRoute(MyRequestTemplate routingRequestTemplate)
    {
    return null;
    }
    }

  • 其次在WebApiConfig文件中定义以下路由。

    // Controller Only
    

    // To handle routes like /api/VTRouting
    config.Routes.MapHttpRoute(
    name: “ControllerOnly”,
    routeTemplate: “api/{controller}”
    );

    // Controller with ID
    // To handle routes like /api/VTRouting/1
    config.Routes.MapHttpRoute(
    name: “ControllerAndId”,
    routeTemplate: “api/{controller}/{id}”,
    defaults: null,
    constraints: new { id = @”^\d+$” } // Only integers
    );

    // Controllers with Actions
    // To handle routes like /api/VTRouting/route
    config.Routes.MapHttpRoute(
    name: “ControllerAndAction”,
    routeTemplate: “api/{controller}/{action}”
    );

2020-05-19