2012-04-12 28 views
5

Tôi có một ServiceContract mà trả về kiểu động và trông giống như sau:DataContract và năng động kiểu trả về WCF

public dynamic LoginViaOpenId(string openIdUrl) 

Kiểu trả về năng động có thể là một DataContract mà tôi đã xác định, hoặc một chuỗi. Nhưng kể từ khi tôi đã không sử dụng DataContract của tôi trên dịch vụ, khách hàng không biết bất cứ điều gì về nó và không thể truy cập nó.

DataContract của tôi là một cái gì đó như dưới đây:

[DataContract] 
public enum OpenIdStatus 
{ 
     [EnumMember] 
     Authenticated, 
     [EnumMember] 
     Authenticating, 
     [EnumMember] 
     Cancelled, 
     [EnumMember] 
     Failed, 
     [EnumMember] 
     RedirectToLogon 
} 

Tôi biết nếu tôi có loại thứ bậc tôi có thể đã sử dụng KnownType để chinh phục này, nhưng tôi ra khỏi ý tưởng cho kịch bản này. Bất kỳ ý tưởng nào?

Trả lời

16

Một DataContract động là một nghịch lý. Một DataContract là một cấu trúc dữ liệu được xác định trước và được thoả thuận chung, và dynamic là một đối tượng có cấu trúc không được xác định trước và do đó không thể được thỏa thuận, vì nó có thể là bất cứ thứ gì.

Nó không xuất hiện bạn thực sự cần phải trả lại một loại dữ liệu động, mà là một kiểu dữ liệu khác nhau. Sự khác biệt là một kiểu dữ liệu khác nhau là một trong một tập hợp các kiểu dữ liệu cố định, trong khi một kiểu dữ liệu động là kiểu dữ liệu không có cấu trúc xác định trước. Vì giá trị trả về của bạn là một trong nhiều hình dạng biết, nên không cần sử dụng loại động "không có kích thước" (hoặc "dạng tự do"), không được WCF hỗ trợ.

Thay vào đó, bạn có thể có phương pháp [OperationContract] trả về một kiểu với một [DataContract] mà sẽ đóng vai trò như một đối tượng wrapper mà có một thành viên dữ liệu duy nhất của loại hình object, và sử dụng [KnownType] trên đối tượng wrapper để xác định các loại có thể là có thể trả lại bên trong trình bao bọc. Vì mọi thứ được kế thừa từ object, đã có một hệ thống phân cấp.

[DataContract] 
[KnownType(typeof(OpenIdStatus))] 
[KnownType(typeof(string))] 
public class ReturnValue 
{ 
    [DataMember] 
    public object Value { get; set; } 
} 
+0

cảm ơn ý tưởng thanh lịch :-) – CjCoax

3

Tôi nghĩ rằng WCF là sẽ có vấn đề serializing/deserializing loại động của bạn. Tôi khuyên bạn nên thiết lập một hợp đồng cho phương thức trả về dựa trên một giao diện xác định. Ngoài ra, bạn có thể tự chịu trách nhiệm về việc tuần tự hóa và làm cho dịch vụ của bạn trả về một chuỗi. Khách hàng sẽ phải có kiến ​​thức về loại để loại bỏ chuỗi ký tự. Có một câu hỏi tương tự về vấn đề này ở đây: -

How to return dynamic List from WCF HTTP Service

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