2012-04-06 111 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

相關問題