Asp.net mvc 4 ASP.NET Web API-一个控制器上有多个POST方法?

Asp.net mvc 4 ASP.NET Web API-一个控制器上有多个POST方法?,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我一直在尝试向默认的ValuesController类添加第二个POST方法,该方法将接受一个id参数,其行为与PUT方法相同,如下所示: using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Web.Http; namespace WebCalendar.Controllers { public class ValuesControl

我一直在尝试向默认的ValuesController类添加第二个POST方法,该方法将接受一个id参数,其行为与PUT方法相同,如下所示:

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将使用另一种方法。我尝试过重命名这些方法,甚至在这两个方法上都使用了
[HttpPost]
,但都没有效果

如何在一个ApicController中有多个POST方法

编辑

以下是我使用的唯一路线:

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

你必须在你的路线中包括行动:

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

您可以发布您的路线吗?控制器上可以有多少种发布方法没有限制。我怀疑这是一个路由问题。你调用的URL是什么使这个失败的?如果为值提供查询字符串,会发生什么情况?我认为问题在于路由必须有值参数才能工作,因为它没有被标记为可选。我在这里添加了一些对我有用的观点:将其标记为答案(因为它工作),但我不明白的是:为什么需要操作?这两个单独的Get方法在没有它的情况下可以工作,那么为什么我需要为Post方法添加它呢?如果您要从第一个Post中删除value param,它将在不显式指定操作的情况下工作,但是您将无法发布任何数据。您只能使用唯一的URI处理POST。它与Get一起工作,因为{id}是可选的路由参数。所以values/get routes to get()和values/get/1 routes to get(int)。您确实需要手动定义路由。请将其放入WebApiConfig.cs,而不是RouteConfig.cs:)
routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);