【问题标题】:multiple post methods in same controller同一控制器中的多个发布方法
【发布时间】:2017-05-20 19:31:24
【问题描述】:

我正在尝试创建具有多个发布操作的 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/Controller 与 POST 命中 Post,/api/Controller/Search 返回 404 - 未找到

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案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】:

      在同一个控制器中拥有多个 POST 操作并没有错,而且您已经清楚地区分了它们。

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

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

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

      理想情况下,这应该带您进入 POST 方法,如果您在 URL 中添加 /Search,它应该带您进入 Search 方法。

      此外,您可以使用Web API Route Debugger Nuget package 来帮助您确定路线匹配是如何发生的并进行更正。

      【讨论】:

        【解决方案3】:

        在我看来,由于以下原因,路线让程序难以理解:

        当您向 /api/Controller/Search 发送 POST 请求时 - 程序对去哪里感到困惑: 1) api/{controller}/{action} 作为 {id} 在这里是可选的 或者 2) api/{controller}/{id}

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

        您的路线必须过滤到一个唯一的路径,我相信您需要在这里更改您的路线。

        【讨论】:

          猜你喜欢
          • 2015-07-23
          • 1970-01-01
          • 2013-10-07
          • 2021-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-06
          • 2013-07-03
          相关资源
          最近更新 更多