2009-11-06 7 views
0

J'essaie de créer un Message en utilisant uniquement un ensemble de paramètres fournis par l'utilisateur et une MessageDescription que j'ai résolue en extrayant le message d'entrée d'un objet OperationDescription dans WCF.Créer un message à partir d'une MessageDescription

Cela semble simple, mais je n'arrive pas à trouver des informations sur la façon de travailler avec des paramètres tels que Body.WrapperElementName et diverses parties de message décrites dans MessageDescription.

Y at-il un expert WCF qui peut m'aider à comprendre ce problème assez complexe?

Répondre

0

Je ne pense pas que cette fonctionnalité soit réellement exposée directement comme ça.

Je n'ai pas essayé cela, mais j'ai passé un peu de temps avec le réflecteur et si cela ne vous dérange pas de vous salir les mains et d'utiliser un peu de réflexion, vous pouvez utiliser Activator.CreateInstance() pour créer un nouveau instance de la classe System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter, qui implémente l'interface IClientMessageFormatter.

Voici les paramètres pour le constructeur:

  • OperationDescription Description
  • DataContractFormatAttribute dataContractFormatAttribute
  • DataContractSerializerOperationBehavior serializerFactory

Notez que dans tous les cas, vous aurez besoin de l'objet complet OperationDescription , mais on dirait que vous y avez accès en tout cas. Puis, il suffit d'appeler SerializeRequest().

+0

Merci pour les pointeurs. Je vais l'essayer. Et puisque j'utilise la dynamique de toute façon c'est déjà lent comme l'enfer, donc plus de réflexion ne devrait pas avoir d'importance un peu;) –

+0

Je l'ai essayé et ça fonctionne en quelque sorte. Pour le moment, cela échoue car j'utilise les mauvais types de paramètres et types de retour dans ma classe dérivée DynamicObject, mais j'y arrive. Je peux créer une nouvelle instance du type et l'utiliser pour sérialiser les paramètres de mon opération. –

0

Si vous pouvez créer un type [MessageContract] pour représenter le message, vous pouvez utiliser la classe TypedMessageConverter.

Vous pouvez également effectuer cette opération en utilisant DataContractSerializerOperationBehavior. vous auriez besoin de «croquer» certains stubs, tels que OperationDescription. En ce qui concerne l'apprentissage de MessageDescription lui-même et des divers paramètres, je recommande de créer une interface [ServiceContract] comme vous voulez, puis d'utiliser ContractDescription.GetContract pour charger le ContractDescription et inspecter les objets MessageDescriptions. Vous pouvez voir ce que WCF utilise pour les valeurs par défaut, etc.

Si vous avez des questions sur des propriétés spécifiques, je pourrais être en mesure de vous aider.

Questions connexes