2009-09-04 43 views
5

Este es un problema extraño que estoy teniendo con WCF al intentar enviar DataTable en la respuesta. Tengo el siguiente contrato de servicios:Devolver objetos DataTable con el servicio WCF

[ServiceContract] 
public interface ISapphireDataService { 
    [OperationContract] 
    DataTable LoadData(string query, DateTime start, DateTime end); 

    [OperationContract] 
    string LoadDataTest(); 
} 

Y la raíz de la aplicación de los métodos (donde el proveedor es una clase que hace la llamada base de datos y vuelve de nuevo un DataTable):

public DataTable LoadData(string query, DateTime start, DateTime end) { 
    //DataSet temp = new DataSet(); 
    //temp.Tables.Add(provider.LoadData(query, start, end).Copy()); 
    //return temp; 

    return provider.LoadData(query, start, end).Copy(); 
} 

public string LoadDataTest() { 
    return "Hello World!"; 
} 

Ahora, cuando dejarlo así, siempre me sale un error al llamar al método LoadData (...): se ha producido

un error al recibir la respuesta HTTP a http://localhost:8731/Design_Time_Addresses/DataProviderServiceLibrary/SapphireDataService/. Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP .
Esto también podría deberse a un contexto de solicitud HTTP que es cancelado por el servidor (posiblemente debido a que el servicio se está cerrando).
Consulte los registros del servidor para obtener más información.

Esto es bastante extraño porque el servicio está configurado para usar wsHttpBinding, que supongo que utiliza HTTP propocol. ¡Este error no ocurre si trato de llamar al método LoadDataTest()!

¡Así que lo que he hecho fue poner esta tabla que obtuve de la base de datos en un objeto DataSet y funcionó! Sin errores ni nada por el estilo. PERO, la tabla que se devolvió en el DataSet estaba VACÍA. Todos los campos son nulos y no hay datos ha sido transferida/deserializado adecuadamente, parece :(

Esto parece ser un problema común pero todavía estoy de ver una respuesta a esta que funciona. ¿Alguna idea?

+1

Básicamente, solo una palabra de consejo: NO ! :-) –

Respuesta

6

Aunque admito que el envío de DataSets y DataTables a través de servicios es MALO y de hecho lo he cambiado, así que no lo estoy haciendo, la raíz del problema está en otra parte.

Para aquellos que TIENEN que usar DataTables/DataSets, el error que recibí fue porque estaba tratando de enviar un objeto DbNull. Supongo que no es serializable o hay alguna otra razón por la que se negó a enviarlo.

Después de "convertir" manualmente DbNull en nulo (tuve que hacer esto para extraer datos en mi propio DataContract personalizado de todos modos), el error desapareció y ¡funcionó!

+2

Has guardado mis cabellos – Esen

17

Sé que esta es una vieja pregunta, pero tal vez alguien todavía está experimentando el mismo problema (como yo). se encontraba con el mismo mensaje de error confuso y pasé horas golpeando mi cabeza cuando me di ....

public DataTable GetDataTable() 
    { 
     DataTable dt = new DataTable(**"MY_NAME"**); 
     dt.Columns.Add("ID", typeof(int)); 
     dt.Columns.Add("Caption", typeof(string)); 

     dt.Rows.Add(new object[] { 1, "hooray!" }); 
     return dt; 
    } 

usted debe dar su nombre DataTable, he usado un constructor sobrecargado y no hay más errores!

EDITAR: Por supuesto, realmente no debería usar DataTable o DataSet como un tipo de devolución de un servicio WCF. Para mí fue solo para fines de prueba, porque pensé que era la forma más rápida de obtener algo de una base de datos y por cable ... chico estaba equivocado :)

+0

Votación. ¡Esa es otra rareza de la que nunca había oído hablar! – Alexandra

Cuestiones relacionadas