2013-06-11 24 views
12

Tôi không thể cho cuộc sống của tôi tìm ra điều này. Tôi có một bộ điều khiển api web với Get và Post phương pháp. Phương thức Get hoạt động tốt khi có và không có tham số, nhưng bài đăng bị ngắt khi tôi cố gắng thêm tham số String vào nó. Dưới đây là mã của tôi.Phương pháp đăng bài ASP.NET WebApi - 404 Khi truyền tham số

Route:

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

Bộ điều khiển:

public class AuditController : ApiController 
{ 
    public String Post(String test) 
    { 
     return "Success : " + test; 
    } 

    public String Get(String test) 
    { 
     return "Success : " + test; 
    } 
} 

Yêu cầu:

var request = WebRequest.Create("http://localhost:42652/Audit"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     using (var writer = new StreamWriter(request.GetRequestStream())) 
     { 
      writer.Write("test=TEST"); 
     } 
     WebResponse webResponse = request.GetResponse(); 

Tôi đã thử nhiều biến thể theo yêu cầu, tôi cảm thấy như có một cái gì đó đơn giản tôi còn thiếu. Cảm ơn bạn đã giúp đỡ.

+1

Tuyến đường của bạn cho biết nó có thông số có tên 'id', nhưng trong phương pháp của bạn, bạn chuyển một tham số có tên' test'. Nó sẽ là gì? Ngoài ra các thông số kiểu nguyên thủy luôn được cố gắng đọc từ Uri, vì vậy phương thức đăng bài của bạn sẽ không hoạt động. Tôi thực sự khuyên bạn nên làm việc thông qua tất cả các hướng dẫn ASP.Net Web API rất đẹp trên trang chủ asp.net! – JustAnotherUserYouMayKnow

+0

là này^^ chính xác? – Jonesopolis

+0

Vâng. Phương thức Nhận của bạn đại diện cho Tuyến đường không có thông số {id} - vì thông số id của bạn không có trong phương thức. Tham số thử nghiệm của bạn là một trong các tham số truy vấn tùy chọn, khi bạn gọi 'Kiểm tra? Test = value', nhưng không phải là' Kiểm tra/giá trị'. Câu trả lời bạn chấp nhận tổng hợp này tốt, nhưng tôi vẫn khuyến khích bạn thực sự làm việc thông qua các hướng dẫn! – JustAnotherUserYouMayKnow

Trả lời

21

Vì bạn đang mong đợi tham số test đến từ phần thân của yêu cầu, bạn sẽ cần phải trang trí nó với thuộc tính FromBody. Ví dụ: ([FromBody]String test). Điều này không đúng đối với các loại phức tạp khác, ví dụ: Employee lớp được xem xét ngầm đến từ Thân thể.

BẬT yêu cầu GET. Nên làm việc chỉ với thử nghiệm đến từ chuỗi truy vấn /Audit?test=Mike

Tiếp theo bài viết trên blog có thêm chi tiết về thông số ràng buộc: http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

Ngoài ra, tôi thấy rằng bạn đang sử dụng WebRequest. Bạn đã xem xét sử dụng HttpClient từ System.Net.Http thay vào đó?

+0

Tôi đã thêm thuộc tính FromBody và nó sẽ tiếp cận dịch vụ ngay bây giờ, nhưng biến 'test' bên trong phương thức post là không may. Tôi cũng sẽ xem xét HttpClient. – Jonesopolis

+0

thử gửi '= TEST' trong cơ thể của bạn. –

+0

tuyệt vời mà đã làm nó! Cảm ơn bạn đã hiểu biết của bạn – Jonesopolis

Các vấn đề liên quan