2009-01-29 11 views
63

Je retourne une liste de ma méthode WCF. Dans mon code client, les types de retour sont affichés en tant que MyObject []. Je dois utiliser soit MyObject [], ou IList ou IEnumerable ...Pourquoi WCF renvoie myObject [] au lieu de List <T> comme je m'y attendais?

WCFClient myClient = new WCFClient(); 

    MyObject[] list = myClient.GetMyStuff(); 
or 
    IList<MyObject> list = myClient.GetMyStuff(); 
or 
    IEnumerable<MyObject> list = myClient.GetMyStuff(); 

Tout ce que je fais prend cette collection et liant à une grille. Quel est le meilleur objet pour assigner ma collection retournée?

Répondre

82

Vous pouvez spécifier que vous souhaitez utiliser une liste générique au lieu d'un tableau en cliquant sur le bouton Avancé lorsque vous ajoutez une référence, ou vous pouvez faites un clic droit sur la référence du service et choisissez configurer pour le changer.

La raison est que WCF sérialise les listes génériques en tant que tableaux à envoyer sur le réseau. La configuration indique juste svcutil pour créer un proxy qui les convertit en une liste générique pour votre convenance.

+1

Pouvez-vous le faire dans le projet de service lui-même, de sorte que lorsque vous générez le client de test WCF, vous obtenez LIST au lieu de TYPE []? –

+1

Il existe un moyen de configurer cela à partir de svcutil directement ?, Je dois le créer de cette façon par le svcutil car im sérialiser divers services web en un pour les espaces de noms .. comment puis-je le configurer avec svcutil pour retourner une liste? –

2

Lorsque vous ajoutez la référence de service au projet client cliquez sur le bouton Avancé et changer le type de collection de tableau à ce que vous voulez qu'il soit ...

12

Lorsque vous utilisez svcutil.exe pour créer votre code client, vous devez Dites-lui comment résoudre certaines références qui ne lui sont pas accessibles.

Voici comment vous le feriez pour List<T>:

svcutil /o:YourService.cs /ct:System.Collections.Generic.List`1 http://example.com/mex 
+1

Ceci est une bonne solution mais ne gère pas le cas générique de 'J'utilise C# avec C#, et je n'ai pas besoin d'étapes supplémentaires pour devoir toujours résoudre manuellement les types de collection courants avec la pléthore de services que je suis. Créer et déployer ' –

8

Le Stever B est correct. WCF essaie vraiment de ne pas être couplé à .NET. Vous pouvez autoriser un client Java à se connecter à votre composant. Les tableaux sont interopérables. Les listes génériques .NET ne le sont pas. Cependant, vous pouvez créer votre propre classe de proxy qui convertira le tableau dans une liste ou toute autre chose que vous souhaitez. La bonne chose à propos de la création manuelle de vos propres procurations est que vous êtes en contrôle total de ce qu'ils font.

Questions connexes