Question

J'ai un service Web que j'appelle à partir d'une application Windows Forms (les deux .NET et la même solution), et j'aimerais que mon service Web renvoie un objet personnalisé provenant d'ailleurs dans le projet. objet qu'ils partagent tous les deux une référence, comme c'est dans le troisième projet de ma solution. Lorsque j'appelle le service Web, il renvoie un "Personne". object, mais il se trouve dans l'espace de noms du webservice, et il est créé à partir d'une classe de proxy que le webservice a généré. En tant que tel, je ne peux pas le manipuler et le retourner à mon programme, qui attend une "Personne". objet basé sur la copie partagée de la classe, et non sur une copie proxy de l'espace de noms webservice, et j'obtiens une erreur lorsque j'essaie de la taper dans le type de classe correct.

Comment forcer le service Web à utiliser une copie locale de la classe, et non une copie proxy? Ma question a-t-elle un sens dans ce contexte? Si non, je vais clarifier.

À noter - j'ai passé tous les paramètres de ByRef et utilisé ces valeurs retournées pour remplir une copie de l'objet que je crée à mon retour. Cela ne peut pas être la meilleure façon de faire cela!

Était-ce utile?

La solution

Si vous utilisez svcutil.exe pour générer un proxy client WCF, vous pouvez utiliser / reference sur la ligne de commande pour spécifier l'assembly contenant la classe commune. Svcutil devrait réutiliser cette définition de classe au lieu d'en générer une nouvelle dans l'espace de noms du proxy de service.

De plus, cela ne fonctionnera que si votre classe commune est sérialisable et passée par valeur (c'est-à-dire qu'elle est exposée en tant que contrat de données et non en tant que contrat de service).

Autres conseils

Si vous utilisez WCF, est-il assez facile d'utiliser les mêmes contrats de données et la même interface de service entre le client et le consommateur. Vous pouvez soit compiler dans la classe de proxy générée et la modifier pour utiliser les espaces de nom corrects, soit utiliser ChannelFactory pour créer un proxy dynamique pour vous.

La première solution est très fragile et vous obligera à modifier la classe proxy chaque fois que l'interface de service change. La deuxième technique fonctionne assez bien et nous l'avons utilisée lors d'un projet précédent sur lequel j'ai travaillé. Avec l’une de ces méthodes, vous devez vous assurer que tous vos appelants continuent sont à jour avec la dernière version de l’interface.

D'après votre description du problème, il semble que vous souhaitiez que le service et le client partagent la même instance. Comme WCF sérialise et désérialise vos types au fur et à mesure de leur envoi vers et depuis le service, vous devrez faire quelque chose d'un peu plus intelligent. Est-ce ce que vous vouliez dire?

Je ne suis pas sûr, mais lorsque vous compilez un service Web .NET, il crée un fichier DLL que vous pouvez utiliser pour le local. Mais lorsque je construis des applications orientées services, je crée différentes couches dans ma solution, par exemple couche d'accès aux données, couche logique, couche de service, couche d'interface utilisateur, couche de contrôleur et, par exemple, dans la couche de contrôle, une méthode d'authentification d'utilisateur est utilisée. connecté à la couche d'accès aux données et à la couche logique, puis j'appelle cette méthode sur la couche de service. Je peux également l'appeler sur la couche d'interface utilisateur. Si je l'appelle depuis la couche d'interface utilisateur, elle est appelée localement, lorsque je souhaite l'utiliser. à partir de la couche service, je vais créer une méthode Web à l'aide de cette méthode, qui renverra un bool ou un nom d'utilisateur, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top