2010-02-18 13 views
2

J'ai deux services WCF qui sont logiquement différents et je souhaite les garder séparés. Ils ont chacun une opération qui renvoie le même contrat de données. Un seul client Silverlight consomme les deux services. Lorsque j'ajoute une référence de service dans le client Silverlight à chaque service, le contrat de données unique se termine deux fois dans le code généré. Est-il possible d'avoir les deux références de service utilisent la même définition du contrat de données? D'après ce que j'ai lu, pour les clients non Silverlight, il est possible de compiler les contrats de données dans un ensemble séparé qui est référencé à la fois par le serveur et le client. Cependant, ce n'est pas possible avec Silverlight (au moins en Silverlight 3).Deux services WCF renvoient le même contrat de données au client Silverlight

Merci,
Rob

Répondre

1

Avez-vous essayé de générer les clients à l'aide de svcutil. Si vous fournissez plusieurs points de terminaison de service, tout fonctionne correctement, mais cela génère une tonne d'erreurs générant les clients.

2

Stian,

Merci pour la réponse rapide. J'ai regardé le screencast de Miguel Castro et c'était très instructif. Malheureusement, il ne couvre pas la situation Silverlight. Cependant, en utilisant cela comme point de départ, j'ai pu obtenir quelque chose de fonctionnel que d'autres pourraient trouver utile.

Créez deux assemblys: ServerDataContracts et SilverlightDataContracts (celui-ci en tant qu'ensemble silverlight). Dans chacun de les AssemblyInfo.cs ajoutez la ligne suivante:

[assembly: ContractNamespace("http://YourNamespaceUri", 
ClrNamespace = "YourDataContractsNamespace")] 

Ajouter tous vos DataContracts à l'assemblée de ServerDataContracts. Dans l'assembly SilverlightDataContracts, cliquez avec le bouton droit sur le projet (ou le sous-dossier) et sélectionnez "Ajouter un élément existant". Accédez aux DataContracts dans l'assembly ServerDataContracts et sélectionnez ceux que vous souhaitez ajouter. NE PAS HIT "Ajouter" !!! Au lieu de cela, cliquez sur la flèche vers le bas à côté de "Ajouter" et sélectionnez "Ajouter comme lien". Cela lie le projet SilverlightDataContracts aux fichiers existants dans le projet ServerDataContracts. Maintenant, lorsque vous en modifiez un, les deux projets obtiennent le changement. Lorsque vous compilez, les projets compilent séparément avec leurs cibles correctes.

Ajoutez maintenant l'assembly ServerDataContracts comme référence à votre projet de contrat de service. Faites de même pour votre assemblage SilverlightDataContracts vers votre application Silverlight. Lorsque vous ajoutez une référence de service de votre client Silverlight à votre service, elle ne doit pas générer les contrats de données. Il devrait plutôt utiliser ceux de votre assemblée.

J'ai réussi à obtenir ce résultat, mais il manque encore certaines des fonctionnalités fournies par les classes de contrat de données générées. Les classes générées implémentent INotifyPropertyChanged qui est extrêmement utile lors de la liaison de données dans silverlight/wpf. Bien que vous puissiez l'implémenter vous-même, il est assez fastidieux et votre code serveur doit maintenant exécuter tous ces gestionnaires d'événements sur chaque ensemble de propriétés, même si vous ne vous abonnerez probablement jamais à l'événement PropertyChanged sur le serveur.

Je suis toujours à la recherche d'un moyen plus propre de gérer cela. Il semblerait que silverlight 4 vous facilitera la tâche puisque vous pouvez utiliser le même assemblage dans le client et le serveur (le code compilé est compatible). Malheureusement, c'est trop loin pour mes besoins.

+1

Cela devrait vraiment avoir été ajouté à votre question à titre d'information supplémentaire. – ChrisF

0

Ceci est irritant mais cela a fonctionné. J'ai un service principal, et plusieurs services de soutien. Le service principal où tous les contrats de données appartiennent, et les services de support devraient réutiliser les contrats de données spécifiés dans le service principal.

J'ai créé un ensemble silverlight pour agir uniquement en tant que client du service principal. Ensuite, j'ai fait référence à mon application Silverlight. Ensuite, dans l'application Silverlight, j'ai ajouté mes services de soutien.Lors de l'ajout d'un service de prise en charge, l'écran avancé vous permet de spécifier s'il doit réutiliser les types dans les assemblys référencés. Il est activé par défaut. Comme le service principal est spécifié dans un assembly référencé, tous les services de support utilisent les contrats de données du contrat principal.

Ce n'est pas joli, mais ça marche.

+1

Vous devez soit modifier votre question avec plus d'informations ou simplement poster une seule réponse. Stack Overflow n'est pas un forum traditionnel, c'est un site de questions et réponses, donc vous n'avez pas de conversations comme vous le feriez dans un forum. – ChrisF