Question

Selon mon autre article sur Valeurs de retour du service WCF , je consomme un service Web d'une autre société et lorsque j'ajoute la référence du service dans Visual Studio, la valeur de retour de la méthode est un objet de type objet. .

L'auteur du service Web m'a montré le code et renvoie en fait un objet typé.

Est-ce que je manque quelque chose ou la classe proxy est-elle supposée renvoyer une valeur typée?

Existe-t-il un paramètre permettant de générer la classe proxy ou le service réel?

MISE À JOUR:

J'ai examiné les classes présentes derrière le service WCF et me suis rendu compte que la valeur de retour de la méthode de service renvoie en réalité une interface , que le type concret implémente. Le type concret est marqué avec l'attribut [DataContract] (et les attributs appropriés [DataMember]), mais l'interface ne possède pas de tels attributs. Cela pourrait-il amener le service à définir le type de retour comme objet?

Était-ce utile?

La solution

En théorie, si vous étiez le développeur du service, vous pourriez utiliser un KnownTypeAttribute :

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

Je n'ai pas personnellement essayé cela avec une interface, mais je l'ai essayé avec une classe de base abstraite et cela fonctionne bien. Lorsque le client reçoit la valeur de retour, il peut réussir le downcast vers la classe dérivée.

C'est peut-être le code de service qui fait cela, et le problème réside dans le fait que svcutil.exe ne génère pas les classes proxy avec suffisamment de précision.

Bien que vous ne contrôliez pas le code de service, vous contrôlez le code proxy du client. Vous pouvez essayer de modifier manuellement les classes de proxy que svcutil.exe vous a demandé d'ajouter vous-même le KnownTypeAttribute . En procédant de la sorte, vous prenez le contrôle du comportement de DataContractSerializer et si vous veillez à ne pas modifier le format filaire des données par erreur, tout devrait fonctionner.

Autres conseils

La classe proxy est un fichier généré et peut donc contenir des erreurs. Si vous avez une copie du contrat de données, vous êtes libre de changer la classe de proxy pour utiliser le type correct plutôt que System.Object et tout devrait fonctionner correctement.

Visual Studio " Ajouter une référence de service " tool et svcutil.exe sont très efficaces pour générer des classes de proxy, mais ils ne sont pas parfaits. Les fichiers qu’ils génèrent vous appartiennent à modifier et je vous encourage à simplement modifier l’opération pour renvoyer le contrat de données approprié.

Nous avons rencontré un problème similaire lors de l'utilisation d'un service Web Java à partir de WCF.

Dans notre cas, le type de réponse indiqué était une version limitée de ce qui était effectivement renvoyé.

Ce qui a bien fonctionné pour nous, c’est de lancer l’objet sur le type attendu. Après cela, les données étaient disponibles.

Par conséquent, pour résoudre votre problème, vous pouvez essayer de convertir l'objet au type attendu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top