2010-01-22 3 views
3

J'ai un proxy client WCF qui lit à partir d'un service Web SOAP. Je ne contrôle pas le service, seulement le proxy client. Le résultat de l'appel de l'une des opérations du service est défini comme un très grand schéma XML, dont seul un petit sous-ensemble est pertinent dans mon application.Empêche la désérialisation du client WCF

J'ai créé un comportement WCF personnalisé qui me permet d'analyser la réponse XML brute et de ne lire que les parties pertinentes. Cependant, le proxy désérialise toujours la réponse dans un graphe d'objet (ce qui est assez complexe à cause du schéma XML). En ce qui concerne ma candidature, cette dernière étape est superflue.

Est-il possible d'empêcher mon proxy client WCF d'effectuer la dernière étape de désérialisation de la réponse? Où voulez-vous exactement traiter les parties du message que vous voulez?

Répondre

2

Où voulez-vous exactement traiter les parties du message que vous voulez? En général, il me semble que vous ne voulez pas vraiment que le proxy client par défaut soit généré, et vous feriez mieux d'utiliser votre propre proxy client personnalisé. Si vous pouvez suivre cette route, une option qui serait disponible serait simplement que le proxy renvoie un objet Message au lieu d'un réel DataContract, puis vous pouvez facilement lire le XML brut du corps SOAP et analyser il. Plus facile que d'essayer de jouer avec le sérialiseur, à mon humble avis.

+0

Un proxy client personnalisé semble être une bonne idée. Avez-vous des pointeurs pour savoir par où commencer, si je devais créer mon propre proxy? –

+0

Ce n'est vraiment pas dur. Définissez fondamentalement votre interface de contrat comme vous le feriez pour un service (assurez-vous simplement que tous les noms/espaces de noms correspondent) et ajoutez les méthodes. Créez ensuite une classe dérivant de ClientBase (le code pour tout généré par svcutil vous donnera un indice, c'est très simple). La réponse de Dmitry sur la façon d'utiliser la classe Message est bonne, mais j'ajouterai que vous n'avez pas besoin de l'utiliser pour l'entrée et la sortie ... vous pouvez toujours utiliser DataContracts pour le message de requête, si vous aimez . – tomasr

+0

Ce sont des conseils utiles qui me permettront de démarrer. Merci beaucoup! –

2

Begin avec la définition ServiceContract côté client avec l'opération comme

[OperationContract(Action="YourAction", ReplyAction="YourResponseAction")] 
Message YourMethod(Message request) 

Utilisez ensuite generic ClientFactory instancier proxy.

Vous devrez construire manuellement un message de requête et analyser la réponse avec un lecteur unidirectionnel.

Questions connexes