开发者

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 开发者_如何学CbtnAddNum_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


WSDL cannot handle Lists, so it uses an Array instead, doing the conversion before it passes it into your Service Method. Just call ToArray() on your List before calling the method.


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 :)


I did it using WCE3.0 extension. When you generate the reference.cs file, the system puts int[] instead of List<int>. You have to replace int[] by List<int> in reference.cs file.

Regards.


Try this:

 client.CalcluateSum(intArray.ToArray()) 


This question looks similar to this one. I'd say you'd need to write a quick static function that takes in a List and performs a type conversion over to CalculateForm.CalculateService.ArrayOfInt. Your web service has generated this type, and it would seem it expects nothing less. I'm unfamiliar with this behavior because I pass Lists across web services regularly and my web services have always managed to perform the conversion .ToArray() for me.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜