Search code examples
c#web-services

How to pass a List<int> to a service reference (C#, VS2008)


The problem i'm having is that i've created a web service, and a windows form (separate solutions). I added the web service to the form app using a service reference, I can pass an 'int' or a 'string' to the web service no problem, but i cannot pass an array of int's or List<int>

The web service code is as follows:

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<int> listInt)
        {
            int sum = listInt.Sum();
            return sum;
        }
    }
}

and the client code is:

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<int> intArray = new List<int>();

        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);
        }
    }
}

The error I am getting is:

Argument '1': cannot convert from 'System.Collections.Generic.List' to 'CalculateForm.CalculateService.ArrayOfInt'

I am sure it's something simple and I'll feel daft when someone points it out :)

Cheers Carl


Solution

  • I finally got it working!! :)

    I managed to get it to pass the List<int> rather than using the ToArray() method.

    Here's the client code:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace CalculateForm
    {
        public partial class FormCalculate : Form
        {
            List<int> listInt = new List<int>();
    
            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);
            }
        }
    }
    

    and the web service code:

    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<int> listInt)
            {
                int sum = listInt.Sum();
                return sum;
            }
        }
    }
    

    so basically all I had to do was create a new instance of the CalculateService.ArrayOfInt in the client, and add the range of data from the List<int> listInt then pass arrayOfInt to the web service.

    Cheers everyone for your help, no doubt I'll be back soon :)