2010-02-27 4 views
5

El problema que tengo es que he creado un servicio web y un formulario de Windows (soluciones separadas). Agregué el servicio web a la aplicación de formulario usando una referencia de servicio, puedo pasar una 'int' o una 'cadena' al servicio web sin problema, pero no puedo pasar una matriz de int o Lista <int>Cómo pasar una lista <int> a una referencia de servicio (C#, VS2008)

código de servicio web es la siguiente:

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

y el código de cliente es:

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

el error que estoy consiguiendo es:

Argumento '1': no ​​se puede convertir de 'System.Collections.Generic.List' a 'CalculateForm.CalculateService.ArrayOfInt'

Estoy seguro de que es algo sencillo y que se sentirá tonto cuando alguien lo señala:

)

Saludos Carl

+0

Solo cambiaría mi método web :-) A int []. Esto probablemente facilitará la vida de otros consumidores de servicios web. – Robert

+0

Me encantaría pero como es para cursos, especifican que: Crea un nuevo servicio web aspx SOAP (como se discutió en la unidad 1) que calculará la suma de una lista de enteros y devolverá el resultado. No sé si sería posible pasarlo como 'int []' al servicio web, luego convertirlo a 'List ' para realizar la suma, luego devolver un 'int', manteniendo así con la especificación? – Carl

Respuesta

5

¡¡Finalmente lo tengo funcionando !! :)

He conseguido que pase el List<int> en lugar de utilizar el método ToArray().

Aquí está el código de cliente:

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

y el código de servicio 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<int> listInt) 
     { 
      int sum = listInt.Sum(); 
      return sum; 
     } 
    } 
} 

así que básicamente todo lo que tenía que hacer era crear una nueva instancia de la CalculateService.ArrayOfInt en el cliente, y añadir el rango de datos del List<int> listInt luego pase arrayOfInt al servicio web.

Saludos a todos por su ayuda, sin duda Vuelvo pronto :)

6

WSDL no puede manejar listas, por lo que utiliza una matriz en su lugar, haciendo la conversión antes de que se lo pasa en su método de servicio. Simplemente llame a ToArray() en su Lista antes de llamar al método.

+1

Eres mi héroe amigo ... pasé 6 horas hoy trabajando en pasar una lista como parámetro para un webservice webservice y ahí lo tienes ... Gracias de nuevo ... – Nathan

0

Prueba esto:

client.CalcluateSum(intArray.ToArray()) 
0

Esta pregunta es similar a this one. Diría que necesitaría escribir una función estática rápida que tome una Lista y realice una conversión de tipo a CalculateForm.CalculateService.ArrayOfInt. Su servicio web ha generado este tipo, y parece que no espera nada menos. No estoy familiarizado con este comportamiento porque paso las listas en los servicios web regularmente y mis servicios web siempre han logrado realizar la conversión .ToArray() para mí.

+0

Intenté agregar el servicio web a mi aplicación cliente como ' Servicio Web 'en lugar de' Servicio de Referencia 'y esto me permitió pasar la Lista muy bien, el problema es que es para cursos y creo que tiene que ser agregado como' Servicio de Referencia ' Voy a intentar sugerencia de la otra pregunta y ver cómo me pongo en Gracias – Carl

1

lo hice usando la extensión WCE3.0. Cuando genera el archivo reference.cs, el sistema pone int[] en lugar de List<int>. Debe reemplazar int[] por List<int> en el archivo reference.cs.

Atentamente.

Cuestiones relacionadas