同一控制器中的多个post方法

时间:2017-05-20 19:31:25

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

我正在尝试使用多个帖子操作创建web api。

我有2个帖子

    [HttpPost]
    [ActionName("Search")]
    public HttpResponseMessage Search(string value)
    {
        return null;
    }

    [HttpPost]  
    public HttpResponseMessage Post([FromBody]CreateModel app)
    {
        return null;
    }

和webApiConfig文件中定义的路由:

        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

/ api /控制器与POST命中帖子,/ api / Controller /搜索返回404 - 未找到

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

在同一个控制器中执行多个POST操作并没有任何问题,并且您已明确区分它们。

您遇到的问题在于您如何定义路线。您可以观察到两个操作都没有名称为'id'的参数,但您在路线中描述它们。

首先,从您的路线中删除id参数的提及,例如

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

理想情况下,这会将您带到POST方法,如果您在网址中添加/搜索,则会将您带到搜索方法。

此外,您可以使用Web API Route Debugger Nuget package来帮助您确定路线匹配的发生方式,并且当然也会对其进行更正。

答案 1 :(得分:1)

您可以使用attribute routing

首先,在您的WebApiConfig.cs中,添加

config.MapHttpAttributeRoutes();

然后在路径的Route属性中将路径定义为字符串,如此

[HttpPost]
[Route("api/controller/search")] 
public HttpResponseMessage Search(string value)
{
    return null;
}

[HttpPost] 
[Route("api/controller/create")] 
public HttpResponseMessage CreateModel([FromBody]CreateModel app)
{
    return null;
}

而且,Search方法更适合使用HTTP / GET。

答案 2 :(得分:0)

对我而言,由于以下原因,路线似乎令程序难以理解:

当您向/ api / Controller / Search发送POST请求时,程序对于去哪里感到困惑: 1)api / {controller} / {action} as {id}在这里是可选的 要么 2)api / {controller} / {id}

两者都有相同的路线结构。因此,对于您给出的示例,路由有两种可能的重定向方式,这将使您获得404。

您的路线必须过滤到一条独特的路径,我相信您需要在此处更改路线。