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; }
}
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
Vous devez vous connecter pour publier un commentaire.
Il y a deux options:
Béton type de collection (Liste, etc.) il doit être utilisé comme valeur de retour de fournir mécanisme de sérialisation pour WCF (Collection de Types de Données, de Contrats, de MSDN).
À l'aide de connu des types de données (Contrat de données les Types Connus, MSDN).
Opter pour une dur<T> le type a fait le tour. Toujours curieux de savoir pourquoi c'était nécessaire. Il est probablement plus sûr d'utiliser une Liste<T> dans tous les cas.
Heureux que ça vous a aidé. Les règles sont décrites ici: Collection de Types de Contrats de Données.
OriginalL'auteur Sergey Brunov