WCF DataContract - impossible de revenir de type complexe

J'ai un service WCF qui a des méthodes pour retourner IEnumerable<T> des collections d'objets, et aussi un type complexe, OrganizationCollection, qui a un peu de propriétés, qui sont chacun un IEnumerable<T> de différents types. Je crois que j'ai mis en place mon Contrat de Service correctement, et défini mon types DataContract /DataMember correctement. La méthode qui retourne un OrganizationCollection échoue avec une exception. Je sais que la méthode fonctionne depuis j'ai des tests unitaires et d'intégration que de le tester. C'est seulement lors de l'exécution avec un live et déployé service qu'il échoue. J'ai même précisé le type de ServiceKnownType, mais en vain. Que dois-je faire pour configurer le service pour être en mesure de retourner les types complexes comme OrganizationCollection?

Remarque: Le service WCF est en cours d'exécution avec basicHttpBinding, et est logé dans un ServiceHost dans un Service Windows.

[Système.ServiceModel.CommunicationException] {"Une erreur s'est produite lors de la réception de la réponse HTTP à http://localhost:8799/MyService. Cela pourrait être dû à la point de terminaison de service de liaison de ne pas utiliser le protocole HTTP. Cela pourrait aussi être dû à une requête HTTP contexte été interrompue par le serveur (éventuellement à cause de l'arrêt). Voir les journaux du serveur pour plus de détails."} Système.ServiceModel.CommunicationException

[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single)]
[ServiceKnownType(typeof(OrganizationCollection))]
public class MyService: IClientService
{ 
    //...
}

[ServiceContract]
public interface IClientService
{
    //This works:
    [OperationContract]
    IEnumerable<BookSvc> GetBooks(DateTime sinceDate);

    //This fails, with the above exception:
    [OperationContract]
    OrganizationCollection GetOrganizations(DateTime sinceDate);
}

BookSvc est défini avec [DataContract] et chaque propriété a [DataMember]. Cela est également vrai avec des Enseignants et des Étudiants des classes. Les propriétés sont tous des types primitifs. OrganizationCollection est défini comme:

[DataContract]
public class OrganizationCollection
{
    [DataMember]
    public IEnumerable<Teacher> Teachers { get; set; }

    [DataMember]
    public IEnumerable<Student> Students { get; set; }
}
D'abord: votre Teacher et Student classes marqué comme [DataContract] ainsi? Deuxième: Avez-vous essayez de changer le type de vos propriétés à Teacher[] et Student[]? Ils doivent être entièrement énumérées de toute façon avant d'être retournés au cours de la WCF.
1. Oui, l'Enseignant et l'Élève sont marqués comme [DataContract]. 2. Je peux essayer, mais mes méthodes de travail lorsque j'exécute également de retour en tant que IEnumerable<T>, mais je ne rendent compte qu'ils sont autonomes les valeurs de retour et ne fait pas partie d'un type complexe.
Je ne suis pas sûr; je vais laisser à quelqu'un d'autre pour donner des informations de réponse. Je viens de suggérer quelque chose que vous pourriez essayer pour une solution rapide. Cependant, je ne pense pas que IEnumerable<T> est un bon choix de conception pour ce scénario de toute façon; le type complexe devrait être contraint de tenir un peuplée de la collection. Je préfère ICollection<T> si vous voulez aller pour le plus bas de l'interface.
Vous pouvez lire ici: Collection de Types de Contrats de Données.

OriginalL'auteur Stealth Rabbi | 2012-02-01