2009-09-04 7 views
5

Questo è uno strano problema che sto riscontrando con WCF durante il tentativo di inviare DataTable nella risposta. Ho il seguente contratto di servizio:Restituzione di oggetti DataTable con servizio WCF

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

    [OperationContract] 
    string LoadDataTest(); 
} 

E la seguente implementazione dei metodi (dove provider è una classe che effettua la chiamata database e restituisce indietro 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!"; 
} 

Ora, quando lasciare in questo modo, ho sempre arrivare un errore quando si chiama il metodo LoadData (...): si è verificato

un errore durante la ricezione della risposta HTTP per http://localhost:8731/Design_Time_Addresses/DataProviderServiceLibrary/SapphireDataService/. Questo potrebbe essere dovuto al binding dell'endpoint del servizio che non utilizza il protocollo HTTP .
Ciò potrebbe anche essere dovuto a un contesto di richiesta HTTP interrotto dal server (probabilmente a causa dell'arresto del servizio).
Vedere i registri del server per ulteriori dettagli.

Questo è piuttosto strano perché il servizio è configurato per utilizzare wsHttpBinding, che presumo utilizza il propocol HTTP. Questo errore non si verifica se provo a chiamare il metodo LoadDataTest()!

Quindi quello che ho fatto è stato mettere questo tavolo che ho ottenuto dal database in un oggetto DataSet e ha funzionato! Nessun errore o qualcosa del genere. BUT, la tabella che è stata restituita nel DataSet era EMPTY. Tutti i campi erano Null e nessun dato è stato trasferito/de-serializzato correttamente, sembra :(

questo sembra essere un problema comune, ma io sono ancora vedere una risposta a questo che funziona. Tutte le idee?

+1

Fondamentalmente solo una parola di consiglio: NON FARE ! :-) –

risposta

6

Mentre ammetto che l'invio di DataSet e DataTable tramite i servizi è BAD e in realtà l'ho modificato in modo che non lo stia facendo, la radice del problema è altrove.

Per quelli che DEVONO assolutamente utilizzare DataTables/DataSet, l'errore che stavo ottenendo era perché stavo cercando di inviare un oggetto DbNull. Immagino che non sia serializzabile o che ci sia un altro motivo per cui si è rifiutato di inviarlo.

Dopo aver "convertito" manualmente DbNull in null (dovevo farlo per estrarre i dati nel mio DataContract personalizzato comunque), l'errore era sparito e ha funzionato!

+2

Mi hai salvato i capelli – Esen

17

So che questa è una vecchia domanda, ma forse qualcuno sta ancora vivendo lo stesso problema (come ho fatto io). mi trovai di fronte con lo stesso messaggio di errore di confusione e passato ore sbattere la testa quando mi ha colpito ....

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

si dovrebbe dare il vostro un nome DataTable, ho usato un costruttore di overload e non più errori!

MODIFICA: Ovviamente, non si dovrebbe utilizzare DataTable o DataSet come tipo di ritorno da un servizio WCF. Per me è stato solo a scopo di test, perché pensavo fosse il modo più veloce per ottenere qualcosa da un database e oltre il filo .... ragazzo mi sbagliavo :)

+0

Voto positivo. Questo è un altro capriccio di cui non ho mai sentito parlare! – Alexandra