2011-09-23 43 views
1

我有這個數據契約:WCF數據契約問題

[DataContract(Namespace = Constants.ServiceNamespace)] 
public enum UserEntityType 
{ 
    User = 0, 
    Group = 1, 
    IPAddress = 2 
} 

[DataContract(Namespace = Constants.ServiceNamespace)] 
//[KnownType(typeof(UserEntity))] 
public class UserEntity 
{ 
    [DataMember] 
    public UserEntityType EntityType; 
    [DataMember] 
    public string Value; 
} 

[DataContract(Namespace = Constants.ServiceNamespace)] 
public class TemporaryPolicyData 
{ 
    [DataMember] 
    public DateTime EndTime; 
    [DataMember] 
    public string URL; 
} 

[DataContract(Namespace = Constants.ServiceNamespace)] 
//[KnownType(typeof(TemporaryPolicyData))] 
//[KnownType(typeof(UserEntity))] 
public class TemporaryWhitelistData 
{ 
    [DataMember] 
    public UserEntity User; 
    [DataMember] 
    public TemporaryPolicyData Data; 
} 

[DataContract(Namespace = Constants.ServiceNamespace)] 
//[KnownType(typeof(TemporaryWhitelistData))] 
//[KnownType(typeof(UserEntity))] 
public class WhitelistPolicyData 
{ 
    [DataMember] 
    public IEnumerable<TemporaryWhitelistData> TemporaryData; 
    [DataMember] 
    public IEnumerable<string> Websites; 
    [DataMember] 
    public IEnumerable<UserEntity> Users; 
} 

我得到這個錯誤:

An unhandled exception of type 'System.ServiceModel.CommunicationException' occurred in mscorlib.dll

Additional information: There was an error reading from the pipe: The pipe has been ended. (109, 0x6d)

這似乎與上面定義的數據合同,因爲如果我把它簡化,它返回數據。

給出該錯誤

的操作方法是:

[OperationContract] 
WhitelistPolicyData GetWhitelistPolicy(); 
+1

任何InnerExceptions?說*簡單*,你的意思是什麼? – Jan

+0

內部異常顯示「附加信息:從管道讀取時發生錯誤:管道已結束。(109,0x6d)」。簡化意味着我從白名單策略數據 字段中排除TemporaryData和Users – Ghita

回答

2

我認爲必須有SerializationException類型的一個更有意義的內部異常。

我唯一看到的是你的枚舉中缺少的[EnumMember]屬性。試試這個:

[DataContract] 
public enum UserEntityType 
{ 
    [EnumMember] 
    User = 0, 
    [EnumMember] 
    Group = 1, 
    [EnumMember] 
    IPAddress = 2 
} 

查看the docu on msdn的解釋。將枚舉[DataContract]放在枚舉上時,還必須指定[EnumMember]屬性。

+0

還有一件事我注意到了。如果IEnumerable 是延遲評估的東西,並且您不強制通過將它轉換爲List()來強制進行評估,我得到相同的錯誤(.NET序列化程序似乎不會在序列化時評估惰性IEnumerable <>) – Ghita

+0

DataContract序列化程序評估所有使用'DataMember'屬性標記的公共屬性。所以我不能承認這一點。也許在序列化程序訪問它時,IEnumerable的評估不再可能。 – Jan