2011-09-23 4 views
1

J'ai ce contrat de données:question contrat de données 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; 
} 

Je reçois cette erreur:

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)

Cela semble être lié au contrat de données défini ci-dessus, parce que si je le simplifier, il retourne des données.

La méthode d'opération qui donne cette erreur:

[OperationContract] 
WhitelistPolicyData GetWhitelistPolicy(); 
+1

Des InnerExceptions? Que voulez-vous dire en disant * simplyfied *? – Jan

+0

L'exception interne indique "Informations supplémentaires: Une erreur s'est produite lors de la lecture du tube: le tube a été arrêté (109, 0x6d)". Simplifié signifie que j'ai exclu des champs WhitelistPolicyData TemporaryData et Utilisateurs – Ghita

Répondre

2

Je pense qu'il doit y avoir une exception intérieure plus significative du type SerializationException.

La seule chose que je vois est les [EnumMember] attributs manquants sur votre énumération. Essayez ceci:

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

Voir the docu on msdn pour une explication. Lorsque vous mettez [DataContract] sur une énumération, vous devez également spécifier l'attribut [EnumMember].

+0

Il y a juste une autre chose que j'ai remarquée. Dans le cas où IEnumerable est quelque chose de paresseux évalué et que vous ne forcez pas l'évaluation en le transformant en List(), j'obtiens les mêmes erreurs (le sérialiseur .NET ne semble pas évaluer le IEnumerable <> paresseux au moment de la sérialisation) – Ghita

+0

Le sérialiseur DataContract évalue toutes les propriétés publiques marquées avec l'attribut 'DataMember'. Donc je ne peux pas le reconnaître. Peut-être que l'évaluation de votre IEnumerable n'est plus possible au moment où le sérialiseur y accède. – Jan

Questions connexes