Cette opération n'est pas prise en charge dans le Client Test WCF
J'ai créé un service WCF et pour le service par défaut, j'ai ajouté un autre contrat d'opération sur les principaux DataContract:
[OperationContract]
void DoSomething(UserData data);
Puis-je avoir quelque chose comme ceci (simplifié pour les fins de l'exemple) ci-dessous. Le problème est que, même si TOUTES les classes de la hiérarchie sont décorées avec DataContract et TOUS leurs membres décorées avec DataMember, lorsque j'utilise le Client Test WCF il a une icône rouge indiquant que "l'opération n'est pas prise en charge dans le client test WCF".
[DataContract]
public class UserData {
[DataMember]
public uint One { get; set; }
[DataMember]
public CompositeType Extra { get; set; }
public UserData() { ctor. code }
}
[DataContract]
public class CompositeType {
[DataMember]
public uint Two { get; set; }
public UserData() { ctor code }
}
Je vois deux classes portant le même nom, mais on est absent type composite, qu'entendez-vous par là? Vous avez aussi oublié de poster la classe de type composite.
Je vois que vous parlez de la hiérarchie. Êtes-vous à la mise en œuvre de tout type de relation récursive? Depuis que nécessiterait la classe utilisée de manière récursive pour être décorés avec de la
désolé faute de frappe erreur, le 2ème (déjà corrigé) a été CompositeType et pas UserData. J'ai aussi ajouté le paramètre ' isreference les sous-types utilisés dans les principaux DataContract mais cela ne résout pas le problème.
Je vois que vous parlez de la hiérarchie. Êtes-vous à la mise en œuvre de tout type de relation récursive? Depuis que nécessiterait la classe utilisée de manière récursive pour être décorés avec de la
[DataContract(IsReference=True)]
désolé faute de frappe erreur, le 2ème (déjà corrigé) a été CompositeType et pas UserData. J'ai aussi ajouté le paramètre ' isreference les sous-types utilisés dans les principaux DataContract mais cela ne résout pas le problème.
OriginalL'auteur Lord of Scripts | 2012-03-23
Vous devez vous connecter pour publier un commentaire.
Ajouter l'attribut 'UserData' classe
[KnownType(typeof(CompositeType))]
Comme:
http://msdn.microsoft.com/en-us/library/ms730167.aspx
Edit:
http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx
La classe OperatingSystem a quelques propriétés qui se rapportent à d'autres classes. Vous pourriez inclure toutes ces classes dans les types connus, mais que la dépendance de la chaîne pourrait obtenir assez gros et que je vous recommande fortement de ne pas utiliser le Système d'Exploitation de classe.
Vous devez travailler quelles sont les informations dont vous avez réellement besoin du Système d'Exploitation de classe et de créer votre propre DTO pour passer de nouveau dans la réponse. De cette façon vous pouvez vous assurer que tous les types sont facilement définissable sur votre contrat.
pouvez-vous créer un exemple de projet et de le télécharger quelque part afin que je (et d'autres) peuvent prendre un coup d'oeil.
C'est le ISampleService.cs
Dans le processus de fabrication d'un meilleur exemple que j'ai découvert le coupable... Un de mes sous-types utilisés dans les DataContract est un .NET classe nommée Système.De l'environnement.OperatingSystem. Quand je l'ai dans le contrat de données, même si j'ai décorer avec [KnownType(typeof(Système d'.De l'environnement.OperatingSystem))] je reçois le message d'erreur. Si je le laisse s'en sortir, alors l'erreur disparaît. Alors, comment puis-je utiliser ces .NET cours dans mon DataContract sans l'obtention de l'erreur?
vous ne pouvez sérialiser les membres dont les propriétés ont été décorées avec le DataMember Attribut, donc, il faudrait créer un wrapper pour certains .Net classes.
OriginalL'auteur Phill
OK, après avoir traversé toute la chose (merci à tous pour les conseils) la solution était:
IsReference
attribut dansDataContract
n'était pas nécessaire à tous lesIsOneWay
attribut dansDataContract
n'était pas du tout nécessaire, même lorsqueOperationContract
était de retour void.KnownType
était pas nécessaire à condition que tous les sous-types dans la hiérarchie était la mienne, en d'autres termes définis par moi-même plutôt que .NET et marqué avecDataContract
ouDataMember
comme appropriéOperatingSystem
et la construction d'un wrapperDataContract
qui extrait la nécessaire information deOperatingSystem
obtenu autour de la question.Maintenant il n'y a pas d'erreur dans le Client Test WCF
Coincé sur ce ainsi, pourrions-nous obtenir une mise à jour?
OriginalL'auteur Lord of Scripts
Fonctionne le service si vous créez un client de test(comme une application console) et d'ajouter une référence de service à la wcf? Si c'est le cas, votre datacontract a probablement l'un de ces types de données non pris en charge par le client Test WCF.
Voir cette question
OriginalL'auteur kjosh
La WCF attente par défaut pour un appel de service est de requête-réponse - WCF s'attend à une certaine sorte de réponse en retour.
Si vous souhaitez utiliser
void
(comme: pas de valeur de retour), vous devez décorer ces méthodes avecdire la WCF runtime pas de s'attendre à une valeur de retour à partir de l'appel
Lire plus sur WCF: Travailler avec des Appels, des Rappels et des Événements ici dans MSDN Magazine.
IsOneWay == true
normal pour les liaisons dans un WCF contrat, n'est-il pas plus adapté pour le DualBinding depuis le dual channel pouvez envoyer un indépendant de la réponse au client?Vous n'avez pas à mettre IsOneWay = true et vous devez être conscient que si vous le faites, le client ne recevront pas de la faute des exceptions générées par le serveur car il n'attend pas le vide de réponse du service wcf sera de retour pour permettre la faute des exceptions à être transmis.
Qui n'a pas tout faire non plus, même problème. Mes opérations du contrat a un seul paramètre de type I ont défini qui est marqué avec DataContract. Que la coutume de type a plusieurs propriétés marquées avec DataMember, chacun d'une coutume (mais plutôt simple) le type, l'ensemble de ces sous-types marqués dans leur déclaration DataContract.
OriginalL'auteur marc_s