2012-04-06 5 views
9

Tôi đã cố gắng để thêm một phương thức POST thứ hai đến lớp ValuesController mặc định rằng sẽ mất một tham số id và hành động giống như các phương pháp PUT, như vậy:ASP.NET Web API - Nhiều phương thức POST trên một bộ điều khiển?

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) { 
     } 
    } 
} 

Vấn đề là, khi tôi thêm thứ hai này phương pháp đăng bài, bất kỳ khi nào tôi gửi yêu cầu POST, tôi nhận được lỗi:

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

Nếu tôi nhận xét một trong các phương pháp (không quan trọng cái nào), POST sẽ làm việc với phương pháp khác. Tôi đã thử đổi tên các phương pháp, và thậm chí sử dụng [HttpPost] trên cả hai, nhưng không có gì đã làm việc.

Làm cách nào để có nhiều phương thức POST trong một ApiController?

EDIT

Đây là con đường duy nhất mà tôi đang sử dụng:

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

Bạn có thể xin vui lòng gửi của bạn tuyến đường? –

+0

Không giới hạn số lượng phương thức đăng bài bạn có thể có trên bộ điều khiển. Tôi nghi ngờ đó là vấn đề định tuyến – TGH

+0

URL bạn đang gọi để thực hiện điều này là gì? Điều gì sẽ xảy ra nếu bạn cung cấp chuỗi truy vấn cho giá trị? Tôi nghĩ rằng vấn đề là tham số giá trị phải ở đó để định tuyến hoạt động vì nó không được đánh dấu tùy chọn. –

Trả lời

7

Bạn phải bao gồm các hành động trong lộ trình của bạn:

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

Đánh dấu đây là câu trả lời (vì nó hoạt động) nhưng những gì tôi không hiểu là: tại sao hành động được yêu cầu? Hai phương thức Get riêng biệt làm việc không có nó, vậy tại sao tôi cần phải thêm nó vào phương thức Post? – Isaac

+2

Nếu bạn đang xóa tham số giá trị khỏi POST đầu tiên, nó sẽ hoạt động mà không chỉ định hành động một cách rõ ràng, nhưng bạn sẽ không thể đăng bất kỳ dữ liệu nào. Bạn chỉ có thể xử lý các bài đăng bằng cách sử dụng các URI duy nhất. –

+0

Nó hoạt động với Get vì {id} là một tham số tuyến tùy chọn. Vì vậy, các giá trị/nhận được các tuyến đường để Nhận() và các giá trị/get/1 tuyến đường để Nhận (int). Bạn thực sự cần xác định thủ công tuyến đường. –