2012-04-02 38 views
15

Tôi không hoàn toàn chắc chắn những gì đã xảy ra ở đây. Tôi có thể có những điều sai lầm ở đâu đó, nhưng tôi không biết điều gì.ASP.NET Web API - Không có 'MediaTypeFormatter' có sẵn để đọc một đối tượng thuộc loại 'Int32'

API của tôi phương pháp điều khiển trông như thế này:

public HttpResponseMessage<string> Put(int id) 

Tôi đã thử một chuỗi cũng với lỗi tương tự.

Bất kỳ ý tưởng nào?

Cảm ơn.

Chỉnh sửa: Để rõ ràng - id là thông số tuyến đường. Phần thân của yêu cầu là JSON. Nếu tôi xóa tham số tuyến đường, phương thức sẽ hoạt động như bình thường.

+0

Bạn có thể đăng yêu cầu thô (từ Fiddler hoặc FireBug) không? – tpeczek

+1

Bạn có xóa bất kỳ trình định dạng mặc định nào không? Bạn cũng có thể đăng mã cấu hình không. – tugberk

+0

Bạn muốn phần cấu hình nào? –

Trả lời

6

Vui lòng đọc sau bài viết trên blog:

này mô tả các vấn đề điển hình nhất với việc sử dụng các thông số đơn giản.Nếu không biết thêm bất kỳ chi tiết nào về yêu cầu của bạn, bạn không thể xác định được yêu cầu nào.

CẬP NHẬT

Có thêm một lỗi được biết cân nhắc giá trị đường. Trong trường hợp khi không phải một trong các trình định dạng dựng sẵn được sử dụng cho yêu cầu POST/PUT/PATCH, các tham số giá trị tuyến đường không bị ràng buộc. Để làm việc xung quanh giải pháp tốt nhất này là viết ActionFilterAttribute như mô tả dưới đây:

+0

Vấn đề của tôi là cụ thể với thông số tuyến đường. Int id trong định nghĩa phương thức trên. –

+0

@RobertoBonini Tôi đã cập nhật phản hồi cho một lỗi được biết đến nhiều hơn về Giá trị lộ trình. – tpeczek

+0

Không có ý tưởng đó là một lỗi - cảm ơn. –

13

Đáng ngạc nhiên, int và chuỗi không có MediaTypeFormatter theo mặc định, do đó, nó không biết cách xử lý các loại đó.

Loại duy nhất mà nó biết cách xử lý ra khỏi hộp là JSON, XML và dữ liệu được mã hóa url biểu mẫu. quote Đây là từ trang web asp.net chính thức, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

Trong Web API, các loại phương tiện xác định như thế nào Web API serializes và deserializes nội dung thư HTTP. Có hỗ trợ tích hợp cho XML, JSON và dữ liệu được mã hóa dạng url và bạn có thể hỗ trợ phương tiện bổ sung các loại bằng cách viết trình định dạng phương tiện.

Bây giờ bạn có thể viết MediaTypeFormatter của riêng bạn (liên kết tôi cung cấp sẽ cho bạn biết cách thực hiện), nhưng vì api web asp.net vẫn đang trong giai đoạn thử nghiệm, tôi đã gặp rất nhiều rắc rối khi sử dụng trình định dạng tùy chỉnh đối với các loại đơn giản như chuỗi. Tôi tìm thấy nó là dễ dàng hơn nhiều chỉ để bọc bất cứ giá trị bạn muốn PUT trong xml/json và nó sẽ tự động được deserialized. Xem bài của tôi ở đây để biết thêm về điều đó, When HTTP-POST has body, url parameter is null

Ví dụ cụ thể của bạn thân PUT của bạn sẽ trông như thế nào,

<message> 
    <id>6</id> 
</message> 

Sau đó, hãy chắc chắn để thiết lập các content-type yêu cầu http của bạn để text/xml (hoặc ứng dụng/json nếu bạn chọn sử dụng nó). Và nó nên tuần tự hóa tốt vào biến.

+0

Điều này sẽ áp dụng nếu nó đã được truyền trong cơ thể - vấn đề của tôi ở đây là với thông số tuyến đường chính nó - trong trường hợp này, id. –

+0

Có, đây dường như là một lỗi trong api beta web asp.net. Khi bạn có một cơ thể trong một PUT hoặc POST tham số url sẽ là null. Thay thế duy nhất tôi có thể cung cấp cho thời gian được là để vượt qua tất cả mọi thứ trong cơ thể, tuy nhiên tôi biết điều này có thể thỏa hiệp cấu trúc url RESTful của bạn mà là quan trọng. – Despertar

+0

Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận hiện tại giải quyết vấn đề nhưng không có giải pháp. Câu trả lời này không có giải pháp. –

5

Bạn đang đặt giá trị int trong phần nội dung của thông điệp yêu cầu? Nếu vậy, định dạng là gì?

Nếu loại nội dung là văn bản, Web API sẽ không biết phải làm gì với nó, vì Web API không cung cấp trình định dạng phương tiện cho văn bản. Bạn có thể viết một trình định dạng tùy chỉnh, như Despertar lưu ý.

Bạn cũng có thể làm điều gì đó như thế này:

public void Put() 
{ 
    var s = Request.Content.ReadAsStringAsync().Result; 
} 
+0

Phần thân là JSON. Tôi chỉ cần nó để làm việc với một tham số tuyến đường. Nếu tôi loại bỏ các tham số tuyến đường từ định nghĩa phương pháp, nó hoạt động. –

0

tôi đăng một DELETE với một cơ thể json và nhận này. Đăng với các tham số đã giải quyết được sự cố.

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