2011-09-23 2 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? * simplyfied *라고 말하면 무엇을 의미합니까? – Jan

+0

내부 예외가 "추가 정보 : 파이프에서 읽는 중 오류가 발생했습니다 : 파이프가 종료되었습니다 (109, 0x6d)"라고 표시됩니다. Simplified는 WhitelistPolicyData에서 제외되었음을 의미합니다. fields TemporaryData 및 Users – Ghita

답변

2

I 형 SerializationException의 더 의미 내부 예외 있어야만 생각한다.

내가 보는 유일한 것은 열거 형에 누락 된 [EnumMember] 속성입니다. 이것을 시도하십시오 :

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

explantion을 보려면 the docu on msdn을 참조하십시오. 열거 형에 [DataContract]을 넣을 때는 [EnumMember] 속성도 지정해야합니다.

+0

알아 두었던 또 다른 사항이 있습니다. IEnumerable 가 게으른 것으로 평가되고 List()로 변환하여 평가하지 않아도됩니다. (.NET serializer는 직렬화 시간에 lazy IEnumerable <>을 평가하지 않는 것 같습니다) – Ghita

+0

DataContract serializer는'DataMember' 속성으로 표시된 모든 공용 속성을 평가합니다. 그래서 나는 그것을 인정할 수 없다. 아마도 IEnumerable의 평가는 시리얼 라이저가 액세스 할 때 더 이상 가능하지 않습니다. – Jan

관련 문제