2017-06-19 3 views
0

Permettez-moi de décrire d'abord mon problème. J'ai eu l'occasion de travailler sur une application Xamarin qui devait utiliser notre API. L'API est exposée via le service WCF sur deux points de terminaison et elle est tcp ou http de base. En raison des limitations de la plate-forme Xamarin, j'ai fini par utiliser HttpWebClient pour lequel je devais rendre mon service WCF reposant. C'est là que les problèmes commencent à émerger.Retour de JSON à partir d'un service WCF dont le contrat de service est marqué avec XmlSerializerFormatAttribute

J'ai défini un autre point de terminaison que j'ai nommé "repos" et l'ai configuré pour renvoyer JSON via la propriété DefaultOutgoingResponseFormat. Cette propriété n'a aucun effet car j'obtiendrai toujours une réponse sous la forme d'un XML.

Si je supprime XmlSerializerFormatAttribute mon service me retournera JSON mais maintenant je n'ai pas XML. Ceci est facilement réparable en faisant un autre point de terminaison dont la valeur de retour par défaut sera XML mais les problèmes deviennent encore plus intéressants car certaines de mes classes ne seront pas sérialisées correctement et je vais l'expliquer maintenant.

Il existe un attribut appelé XmlIgnore qui est placé sur une propriété. Si vous avez un nom appelé Name et une autre propriété nommée NameSpecified et si vous placez cet attribut sur NameSpecified, le nom de la propriété ne sera pas sérialisé si la propriété NameSpecified contient la valeur false. Ceci est extrêmement utile car le code XML envoyé n'est pas encombré d'informations inutiles. Nous voulons conserver ceci, ce qui signifie que nous voulons conserver XmlSerializerFormatAttribute mais aussi pouvoir retourner JSON.

Est-ce possible?

Répondre

0

Une fois que vous utilisez XmlSerializerFormat vous dites WCF utiliser la classe XmlSerializer sur la DataContractSerializer. Il n'y a aucun mécanisme intégré dans WCF qui peut le faire retourner maintenant JSON, parce que vous l'avez explicitement dit d'utiliser un XmlSerializer.

Si vous souhaitez renvoyer un contenu XML ou JSON, vous pouvez prendre entièrement en charge la mise en forme de votre message en créant votre propre implémentation IDispatchMessageFormatter. Il vous appartiendra alors de formater vos messages avec les règles que vous souhaitez.

+0

J'ai regardé le IDispatchMessageFormatter et ce n'est pas quelque chose de trivial à implémenter. Les exemples sont rares et ils utilisent tous JSON tfor showcase. Merde WCF! – Rob