Est-il possible de renvoyer différents types à partir d'une méthode WCF REST?

StackOverflow https://stackoverflow.com/questions/140255

  •  02-07-2019
  •  | 
  •  

Question

J'essaie d'écrire un service Web conformément à spec et il nécessite un corps de réponse différent selon que la méthode aboutit ou non. J'ai essayé de créer deux classes DataContract différentes, mais comment puis-je les renvoyer et les sérialiser correctement?

Était-ce utile?

La solution

La réponse est oui , mais la tâche est délicate et vous perdez la frappe en tapant fort sur votre interface. Si vous renvoyez un flux , les données peuvent être du xml, du texte ou même une image binaire. Pour les classes DataContract, vous devez alors sérialiser les données à l'aide de DataContractSerializer .

Voir le BlogSvc et plus précisément le RestAtomPubService.cs Service WCF pour plus de détails. Notez que ce code source vous montrera également comment accepter différents types de données dans une méthode de repos WCF nécessitant un mappeur de type de contenu.

Autres conseils

La meilleure façon d’indiquer que votre service Web WCF a échoué consiste à déclencher une exception FaultException. Il existe des paramètres dans les fichiers web.config du service qui permettent de transmettre l'intégralité du message d'erreur au client dans le cadre de l'erreur.

Une autre approche consiste à hériter de vos deux résultats de la même classe de base ou de la même interface. Le service renverrait une instance du type de base. Vous pouvez ensuite utiliser l'attribut KnownType pour informer le client que plusieurs types peuvent être renvoyés. À bien y penser, il est peut-être possible d'utiliser Object comme type de base, mais je ne l'ai pas essayé.

À défaut de l'une de ces approches, vous pouvez créer un objet de résultat personnalisé contenant à la fois un résultat et des propriétés d'erreur. Votre client peut alors décider de la marche à suivre. J'ai dû utiliser cette approche pour Silverlight 2 car la version bêta 2 ne prend pas encore totalement en charge les contrats par défaut. Ce n’est pas joli, je ne le recommanderais pas normalement, mais si c’est la seule façon de fonctionner ou si vous estimez que c’est la meilleure approche pour votre situation ...

Si vous rencontrez des problèmes avec ADO.NET Data Services, j'ai moins d'expérience là-bas.

Voici quelques informations sur la mise en oeuvre de FaultContracts

Si vous utilisez une liaison basée sur xml, je pense qu’il n’ya aucun moyen de le faire. Une solution simple dans ce cas consisterait simplement à inclure une partie de l'indicateur de message en cas de défaillance et à stocker les informations de défaillance quelque part si nécessaire. Pour une liaison JSON, vous pouvez utiliser une méthode qui renvoie un objet, puis deux types d’objets différents. Si je me souviens bien (ce qui est rare), cela est possible car la classe JavaScriptSerializer utilise la réflexion si l'objet est pur des attributs de sérialisation.

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