2008-10-10 11 views
1

J'ai un projet de formulaires Windows et un projet de service Web dans ma solution, et j'essaie d'appeler le service Web et de renvoyer un objet client comme résultat. Le problème est que lorsque j'essaie de recevoir l'objet de retour, j'obtiens une erreur qu'il ne peut pas le convertir. Par exemple, voici la signature de mon webservice:.Service Web .NET utilisant une instance d'un type de paramètre?

Public Function GetDriverByID(ByVal DriverID As Integer) As Driver 

Et voici le code que je utilise pour appeler:

Dim d As Driver = mywebserviceinstance.GetDriverByID(1) 

Mais je reçois cette erreur de compilation (wsDrivers est le nom de la référence Web que j'ai ajouté à mon projet de formulaire): "Valeur de type ProjectNamespace.Common.wsDrivers.Driver ne peut pas être converti en ProjectNamespace.Common.Driver"

Cet espace de noms "Common" contient la classe Driver, et je ne suis pas sûr pourquoi la classe de retour du service Web n'est pas seulement un generi c "Driver", mais est à la place un "wsDrivers.Driver", et je ne peux pas le reconvertir. Quelqu'un sait comment je peux faire face à ce type de discordance?

EDIT: Merci pour les explications - cela permet de comprendre ce qu'il fait. Cependant, est-il possible de forcer l'utilisation du type réel au lieu du proxy (ou plutôt, est-il possible de convertir entre l'instance "réelle" et l'instance "proxy"), ou dois-je sérialiser les propriétés avant de les envoyer sur le réseau, puis désérialiser manuellement les valeurs de retour?

Répondre

2

C'est en fait assez commun. Ce qui se passe, c'est que le Web Service a défini les définitions de tous les types utilisés dans le service Web. Lorsque vous ajoutez une référence à ce service Web, il génère automatiquement un type de proxy dans un sous-espace de noms de votre espace de noms. C'est ce qui est retourné par votre service Web lorsque vous l'appelez.

Toutefois, vous faites probablement référence à la même bibliothèque que le service Web qui contient le même type. C'est le type qui est attendu lorsque vous Dim pilote. C'est pourquoi il y a un décalage.

+0

Y a-t-il un moyen de contourner cela? Puisque je référence la même DLL dans les deux projets (le webservice et le projet avec la référence Web), puis-je forcer la "classe proxy" à être une copie de sa classe réelle? Ou y a-t-il un moyen facile de les mettre en correspondance les uns avec les autres? – SqlRyan

0

La référence de service Web dans un projet VB.NET ou C# peut référencer n'importe quel type de service Web et n'est pas limitée à celles fournies par ASP.NET. C'est pourquoi Visual Studio crée des classes proxy pour chaque objet pouvant être extrait du service Web.

+0

Dans un test que j'ai fait avec des services web, j'ai utilisé une classe qui copiait toutes les propriétés publiques d'une classe à l'autre, mais cela devenait complexe avec des structures plus profondes. les références générées seraient intéressantes pour moi aussi! – hangy

Questions connexes