2012-05-02 6 views
6

Tengo un servicio web que debe devolver los 5 correos principales en mi bandeja de entrada y mostrarlos en una cuadrícula de datos. Puse mis datos en un DataTable primero. Pero sigue recibiendo erroresCómo devolver una tabla de datos por un [WebMethod]

Aquí está mi código, ¿Me falta algo o declaro algo malo?

[WebMethod] 
    public DataTable DisplayMailList(String inMailServer, String inPort, bool inSSlCheck, String inUsername, String inPassword) 
    { 
     objClient.Connect(inMailServer, int.Parse(inPort), inSSlCheck); 
     objClient.Authenticate(inUsername, inPassword); 

     int count = objClient.GetMessageCount(); 

     DataTable dtMessages = new DataTable(); // Creating datatable. 
     dtMessages.Columns.Add("MessageNumber"); 
     dtMessages.Columns.Add("From"); 
     dtMessages.Columns.Add("Subject"); 
     dtMessages.Columns.Add("DateSent"); 
     dtMessages.TableName = "dtMessages"; 

     int counter = 0; 
     for (int i = count; i >= 1; i--) 
     { 
      OpenPop.Mime.Message msg = objClient.GetMessage(i); 

      dtMessages.Rows.Add(); 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["MessageNumber"] = i; //Populateing Datatable 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["Subject"] = msg.Headers.Subject; 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["DateSent"] = msg.Headers.DateSent; 

      counter++; 
      if (counter > 5) 
      { 
       break; 
      } 
     } 
     return dtMessages; 
    } 

que el problema es pública DataTable lo tenía declarado como un objeto, sino que no funcionaba éter .... suspiro, lo que debería declarar como?
éste es el error ....

System.InvalidOperationException: Se ha producido un error al generar el documento XML . ---> System.InvalidOperationException: No se puede serializar DataTable. El nombre de DataTable no está configurado.

+1

Un [WebMethod] debe estar estático, su el error dice que no hay un nombre asignado ... intenta asignar un nombre (p. DataTable.TableName = "MyTable") también. – Zachary

+1

Será mejor, a largo plazo, si deja de usar tablas de datos y usa objetos fuertemente tipados. –

Respuesta

12

Asignar un valor a dtMessages.DataTable nombre detendrá el error de serialización, como sugiere el mensaje de error.

[WebMethod] 
    public DataTable GetDataTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Col1", typeof(string)); 
     dt.Rows.Add("testing"); 
     dt.TableName = "Blah"; // <--- 
     return dt; 
    } 

pero estoy de acuerdo con Bob Cuerno de que es mejor definir una clase para el valor de retorno de utilizar un DataTable.

+1

Eso es asumiendo que es un ASP.NET AJAX WebMethod. Si está en un servicio web ASP.NET clásico, no puede ser estático ... –

+0

En realidad, si es estático o no, ASP clásico o no, es irrelevante para esta respuesta. El punto era solo decir "Agregar' dt.TableName = 'Blah'; '". Creo que tu comentario es una distracción. – vapcguy

+0

Mi comentario fue una respuesta a un comentario anterior, que desde entonces se ha eliminado. El comentario anterior tuvo problemas con el hecho de que no había incluido la palabra clave "estática" en la firma del método. –

0

Esto funcionó para mí:

en su aplicación

 public void app() 
     { 
     try 
     { 
      DataTable dtInput = new DataTable(); 
      DataRow drRow; 
      dtInput.Columns.Add("ID"); 
      dtInput.Columns.Add("Name"); 
      drRow = dtInput.NewRow(); 
      drRow["ID"] = 1; 
      drRow["Name"] = "Star"; 
      dtInput.Rows.Add(drRow); 
      dtInput.TableName = "Input";//Table name is mandatory to avoid serialization exception 
      DataTable dtOutput = new DataTable(); 
      dtOutput.TableName = "Output";//Table name is mandatory to avoid serialization exception 
      service.TestService(dtInput ,ref dtOutput); 
     } 
     catch (Exception ex) 
     { 
     } 
     } 

En su servicio

 DataTable dtOutput= new DataTable(); 
     [WebMethod] 
     public void TestService(DataTable dtInput , ref DataTable dtOutput) 
     { 
     DataRow drRow; 
     drRow= dtInput.NewRow(); 
     drRow["ID"] = 2; 
     drRow["Name"] = "Success"; 
     dtInput.Rows.Add(drRow); 
     dtOutput= dtInput; 
     } 
5

acaba de dar un nombre de tabla cuando cree un objeto de tabla de datos

DataTable dt = new DataTable("tablename"); 
Cuestiones relacionadas