2011-09-23 50 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