2008-09-26 34 views
5

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

1

Câu trả lời là 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.

+0

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. –

+0

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

0

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.

2

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

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