2009-03-23 4 views
20

J'écris mon premier service WCF. J'ai décidé d'écrire le service juste comme une DLL pour commencer et ensuite l'aspect des choses de la WCF après, ce qui est où je suis maintenant.WCF: MessageContract, DataContract ... Confus?

L'architecte m'a conseillé de conserver un format spécifique pour les objets de message que j'ai fait. Cependant, j'ai utilisé des Interfaces, des types complexes et des listes de ceux-ci dans mes objets de message. J'arrive à ajouter les attributs et je suis un peu confus.

Voici un exemple de mon code. Est-ce que quelqu'un peut commenter sur l'exactitude dans l'utilisation de MessageContract, DataContract, DataMember et Serializable etc? Des pointeurs ou des erreurs flagrantes?

De plus, quel sérialiseur est le meilleur à utiliser? et quelle est la meilleure stratégie pour m'assurer que je reçois du XML bien formé afin que d'autres clients puissent facilement utiliser mon service?

Répondre

15

Re la demande/réponse - un [DataContract] fonctionnerait tout aussi bien. L'un des avantages des contrats de message est que vous pouvez définir la confidentialité contre les membres, mais dans de nombreux cas, cela n'est pas nécessaire. Dans de tels cas, je préfère garder le contrat aussi simple que possible, tout comme un contrat de données.

Ré au sérialiseur - c'est en grande partie un facteur de la configuration. Par défaut sur http, par exemple, ce sera DataContractSerializer.

Je ne suis pas sûr, cependant, que la liste de IMyComplexType fonctionne très bien. Vous pouvez essayer, mais généralement, il veut des types concrets. Notez qu'avec les classes de base, vous pouvez utiliser [KnownType] pour spécifier les sous-types autorisés. Notez que, contrairement à XmlSerializer, les membres de la collection n'ont pas besoin de setters, bien que vous ayez besoin d'ajouter une méthode de rappel OnDeserializing pour initialiser la liste si vous le faites (WCF n'appelle pas les constructeurs). A côté: vous pouvez également utiliser protobuf-net avec des contrats de données et WCF (tant qu'ils ont un ordre explicite); Ceci est plus dense que le xml ordinaire. Cependant, il n'a pas de support pour les contrats de message pour le moment.

+0

Merci Marc, vous avez raison sur la classe de base. Cela fonctionne un peu mieux. Je jetterai un coup d'oeil à la méthode OnDeserializing, encourage pour les têtes sur cela. Je suis contraint de Xml pour cela par la conception. –

2

Bien que pas une réponse directe à votre question, il vaut la peine de prendre note de ce qui suit de MSDN -Using Message Contracts

Chaque partie d'en-tête individuel de message et le corps du message est sérialisé (transformé en XML) en utilisant la sérialisation choisi moteur pour le contrat de service où le message est utilisé. Le moteur de sérialisation par défaut, le XMLFormatter, peut traiter tout type qui a un contrat de données , soit explicitement (en ayant le système. Runtime. Sérialisation. DataContractAttribute) ou implicitement (en étant d'un type primitif, ayant System.SerializableAttribute, et ainsi de suite).

enter image description here

Questions connexes