Tôi đang cố gắng viết một dịch vụ web cho đặc tả và nó yêu cầu một cơ thể phản hồi khác nhau tùy thuộc vào việc phương thức này có thành công hay không. Tôi đã thử tạo hai lớp DataContract khác nhau, nhưng làm thế nào tôi có thể trả lại chúng và cho chúng được tuần tự một cách chính xác?Có cách nào để trả về các kiểu khác nhau từ một phương thức WCF REST không?
Trả lời
Câu trả lời là có nhưng nó là khó khăn và bạn mất gõ mạnh vào giao diện của bạn. Nếu bạn trả lại Luồng thì dữ liệu có thể là xml, văn bản hoặc thậm chí là hình ảnh nhị phân. Đối với các lớp DataContract, bạn sẽ tuần tự hóa dữ liệu bằng cách sử dụng DataContractSerializer.
Xem BlogSvc và cụ thể hơn là RestAtomPubService.cs WCF service để biết thêm chi tiết. Lưu ý, mã nguồn đó cũng sẽ cho bạn thấy cách chấp nhận các loại dữ liệu khác nhau vào một phương thức nghỉ WCF yêu cầu một trình ánh xạ kiểu nội dung.
Nếu bạn đang sử dụng một ràng buộc dựa trên xml, thì tôi tin rằng không có cách nào để làm điều đó. Một giải pháp đơn giản trong trường hợp đó sẽ chỉ có một phần của lá cờ tin nhắn nếu có lỗi, và lưu trữ thông tin thất bại ở đâu đó nếu cần thiết. Đối với một ràng buộc JSON, bạn có thể sử dụng một phương thức trả về một đối tượng, sau đó trả về hai loại đối tượng khác nhau. Nếu tôi nhớ chính xác (điều này hiếm khi xảy ra), điều đó là có thể bởi vì lớp JavaScriptSerializer sử dụng sự phản chiếu nếu đối tượng được làm sạch các thuộc tính tuần tự hóa.
Cách tốt nhất để chỉ ra rằng dịch vụ web WCF của bạn đã thất bại sẽ là để ném một FaultException. Có các cài đặt trong tệp web.config dịch vụ của bạn cho phép toàn bộ thông báo lỗi được chuyển tới máy khách như là một phần của lỗi.
Một cách tiếp cận khác có thể là kế thừa cả hai kết quả của bạn từ cùng một lớp cơ sở hoặc giao diện. Dịch vụ sẽ trả về một thể hiện của kiểu cơ sở. Sau đó bạn có thể sử dụng thuộc tính KnownType để thông báo cho khách hàng rằng nhiều loại có thể được trả về. Nghĩ lại thì, có thể sử dụng Object làm loại cơ sở, nhưng tôi chưa thử nó.
Không thực hiện một trong các cách tiếp cận này, bạn có thể tạo đối tượng kết quả tùy chỉnh chứa cả kết quả và thuộc tính lỗi và sau đó khách hàng của bạn có thể quyết định nên thực hiện hành động nào. Tôi đã phải sử dụng phương pháp này cho Silverlight 2 vì Beta 2 chưa hỗ trợ đầy đủ các hợp đồng lỗi. Nó không đẹp, tôi sẽ không bình thường giới thiệu nó, nhưng nếu đó là cách duy nhất hoạt động hoặc bạn cảm thấy đó là cách tiếp cận tốt nhất cho tình huống của bạn ...
Nếu bạn gặp khó khăn với ADO.NET Data Services, Tôi có ít kinh nghiệm hơn ở đó.
Here's some information về việc thực hiện FaultContracts
- 1. Có thể có các kiểu trả về khác nhau cho một phương thức quá tải không?
- 2. Ghi đè phương thức với các kiểu trả về khác nhau trong java?
- 3. Làm thế nào để trả về các chuỗi khác nhau từ một kiểu Boolean trong MySQL?
- 4. Cách trả về hình ảnh PNG từ phương thức dịch vụ REST REST tới trình duyệt
- 5. Java - Cách tốt nhất để trả về nhiều kiểu đối tượng từ một phương thức
- 6. Cách trả về các lớp khác nhau từ một hàm?
- 7. Làm thế nào để có một hàm trả về các kiểu khác nhau
- 8. Làm cách nào để gán một biến từ một phương thức có thể trả về null?
- 9. Phương thức ResourceManager.GetString() trả về chuỗi sai từ các assembly khác nhau
- 10. Các kiểu trả về khác nhau của phương thức trừu tượng trong java mà không cần đúc
- 11. Các phương thức Java có thể trả về kiểu Enum không?
- 12. WCF 4 dịch vụ REST không thể trả về một StatusDescription, chỉ có StatusCode
- 13. Làm cách nào để tạo kiểu trả về của một phương thức chung?
- 14. Phương thức SQLCommand ExecuteScalar() trả về kiểu dữ liệu nào?
- 15. Không thể trả về 'null' từ các phương thức chung?
- 16. Trả về định dạng JSON và XML từ dịch vụ web .NET 3.5 WCF (REST)
- 17. Tại sao quá tải phương thức không được xác định cho các loại trả về khác nhau?
- 18. C# Trả về các loại khác nhau?
- 19. Có thể trả về nhiều hơn một giá trị từ một phương thức trong Java không?
- 20. Làm thế nào tôi có thể trả về NULL từ một phương thức chung trong C#?
- 21. có thể là một phương thức có kiểu trả về như danh sách được gọi từ một chủ đề
- 22. Phương thức quá tải các giá trị trả về
- 23. Làm cách nào để xác định loại trả về của một phương thức giao diện là một giao diện khác?
- 24. Giả lập một kiểu trả về từ một kiểu Mocked khác bằng cách sử dụng Moq
- 25. Cú pháp để tham chiếu một phương thức trả về một biểu thức cho phương thức khác?
- 26. Làm cách nào để chỉ định đối tượng trả về từ phương thức cây biểu thức?
- 27. Tôi nên trả về các kiểu khác nhau trong một phương thức dựa trên giá trị của một chuỗi trong Java như thế nào?
- 28. Làm cách nào để trả về giá trị từ phương thức C# một phần?
- 29. Việc ném một ngoại lệ trong một phương thức có khiến phương thức trả về không?
- 30. Phương thức trả về HashMap
Tôi không tìm thấy tệp đó (RestAtomPubService.cs) trong nguồn, tôi đã bỏ lỡ nó hay đã xóa nó chưa? Cảm ơn. –
Chúng tôi đã chuyển từ WCF sang REST vì nó không đủ linh hoạt cho nhu cầu của chúng tôi. Tôi nghĩ rằng các tập tin vẫn nên có trong lịch sử. – JarrettV