Comment passer d’une liste à une référence de service (C #, VS2008)

Le problème que je rencontre est que j’ai créé un service Web et un formulaire Windows (solutions distinctes). J’ai ajouté le service Web à l’application de formulaire à l’aide d’une référence de service. Je peux passer sans problème un “int” ou une “chaîne” au service Web, mais je ne peux pas transmettre un tableau d’int ou List <int >.

Le code du service Web est le suivant:

 using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Web.Services; namespace CalculateService { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] public class Service1 : System.Web.Services.WebService { [WebMethod] public int CalcluateSum(List listInt) { int sum = listInt.Sum(); return sum; } } } 

et le code client est:

 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace CalculateForm { public partial class FormCalculate : Form { List intArray = new List(); public FormCalculate() { InitializeComponent(); } private void btnAddNum_Click(object sender, EventArgs e) { intArray.Add(Convert.ToInt32(txtAddNum.Text)); txtAddNum.Clear(); listBoxAddNum.Items.Clear(); for (int i = 0; i < intArray.Count; i++) { listBoxAddNum.Items.Add(intArray[i]); } } private void btnCalculate_Click(object sender, EventArgs e) { CalculateForm.CalculateService.Service1SoapClient client = new CalculateForm.CalculateService.Service1SoapClient(); int result = client.CalcluateSum(intArray); txtResult.Text = Convert.ToString(result); } } } 

L’erreur que je reçois est la suivante:

Argument ‘1’: impossible de convertir de ‘System.Collections.Generic.List’ en ‘CalculateForm.CalculateService.ArrayOfInt’

Je suis sûr que c’est quelque chose de simple et je me sentirai stupide quand quelqu’un le fait remarquer 🙂

Cordialement Carl

WSDL ne peut pas gérer les listes. Il utilise donc un tableau, effectuant la conversion avant de le transmettre à votre méthode de service. Appelez simplement ToArray () sur votre liste avant d’appeler la méthode.

Je l’ai finalement fait fonctionner !! 🙂

J’ai réussi à le faire passer la List plutôt que d’utiliser la méthode ToArray() .

Voici le code client:

 using System; using System.Collections.Generic; using System.Windows.Forms; namespace CalculateForm { public partial class FormCalculate : Form { List listInt = new List(); public FormCalculate() { InitializeComponent(); } private void btnAddNum_Click(object sender, EventArgs e) { listInt.Add(Convert.ToInt32(txtAddNum.Text)); txtAddNum.Clear(); listBoxAddNum.Items.Clear(); for (int i = 0; i < listInt.Count; i++) { listBoxAddNum.Items.Add(listInt[i]); } } private void btnCalculate_Click(object sender, EventArgs e) { CalculateService.Service1SoapClient client = new CalculateService.Service1SoapClient(); CalculateService.ArrayOfInt arrayOfInt = new CalculateService.ArrayOfInt(); arrayOfInt.AddRange(listInt); int result = client.CalcluateSum(arrayOfInt); txtResult.Text = Convert.ToString(result); } } } 

et le code du service Web:

 using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Web.Services; namespace CalculateService { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] public class Service1 : System.Web.Services.WebService { [WebMethod] public int CalcluateSum(List listInt) { int sum = listInt.Sum(); return sum; } } } 

Il me List listInt donc de créer une nouvelle instance de CalculateService.ArrayOfInt dans le client et d'append la plage de données de List listInt puis de transmettre arrayOfInt au service Web.

Bravo à tous pour votre aide, je suis sûr que je reviens bientôt 🙂

Je l’ai fait en utilisant l’extension WCE3.0. Lorsque vous générez le fichier reference.cs , le système met int[] place de List . Vous devez remplacer int[] par List dans le fichier reference.cs .

Cordialement.

Essaye ça:

  client.CalcluateSum(intArray.ToArray()) 

Cette question ressemble à celle-ci . Je dirais que vous devez écrire une fonction statique rapide qui prend une liste et effectue une conversion de type vers CalculateForm.CalculateService.ArrayOfInt. Votre service Web a généré ce type, et il semblerait qu’il n’attend rien de moins. Je ne connais pas bien ce comportement car je passe régulièrement des listes sur des services Web et ceux-ci ont toujours réussi à effectuer la conversion .ToArray () pour moi.