2012-04-06 130 views
9

我一直在试图添加第二个POST方法的默认ValuesController类,将采取ID参数和行为等同于PUT方法,像这样:ASP.NET Web API - 一个控制器上的多个POST方法?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Http; 
using System.Web.Http; 

namespace WebCalendar.Controllers { 
    public class ValuesController : ApiController { 
     // GET /values 
     public IEnumerable<string> Get()    { 
      return new string[] { "value1", "value2" }; 
     } 

     // GET /values/5 
     public string Get(int id) { 
      return "value"; 
     } 

     // POST /values 
     public void Post(string value) { 
     } 

     // POST /values/5 
     public void Post(int id, string value) { 
      Put(id, value); 
     } 

     // PUT /values/5 
     public void Put(int id, string value){ 
     } 

     // DELETE /values/5 
     public void Delete(int id) { 
     } 
    } 
} 

问题是,当我添加第二个POST方法,任何时候我做一个POST请求,我得到的错误:

"No action was found on the controller 'values' that matches the request." 

如果我注释掉的方法之一(无所谓哪一个),POST将与其他方法的工作。我尝试重命名这些方法,甚至在他们两个上都使用[HttpPost],但没有任何工作。

如何在单个ApiController中使用多个POST方法?

编辑

下面是我使用的唯一途径:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { controller = "values", id = RouteParameter.Optional } 
); 
+2

能否请您发表您的路线? – 2012-04-06 03:51:17

+0

对控制器上有多少种后处理方法没有限制。我怀疑这是一个路由问题 – TGH 2012-04-06 03:54:07

+0

你打电话让这个失败的URL是什么?如果您为值提供查询字符串会发生什么?我认为问题是值参数必须在那里才能工作,因为它没有标记为可选。 – 2012-05-10 01:02:06

回答

7

你必须包括路线中的作用:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
+0

标记此作为一个答案(因为它的工作原理) ,但我不明白的是:为什么需要采取行动?两个独立的Get方法没有它,所以为什么我需要为Post方法添加它? – Isaac 2012-04-07 22:50:18

+2

如果您从第一次POST中删除值参数,它将在没有明确指定操作的情况下工作,但您将无法发布任何数据。您只能使用唯一的URI来处理帖子。 – 2012-04-08 15:19:39

+0

它适用于Get,因为{id}是可选的路由参数。所以值/获取路由到Get()和值/获得/ 1路由到Get(int)。您确实需要手动定义路线。 – 2012-04-30 17:59:04

相关问题