I have a WCF service from which I want to return a DataTable. I know that this is often a highly-debated topic, as far as whether or not returning DataTables is a good pract
For anyone having similar problems, I have solved my issue. It was several-fold.
For a DataTable to be serializable, it needs to be given a name. The default constructor does not give the table a name, so:
return new DataTable();
will not be serializable, while:
return new DataTable("someName");
will name the table whatever is passed as the parameter.
Note that a table can be given a name at any time by assigning a string to the TableName
property of the DataTable.
var table = new DataTable();
table.TableName = "someName";
Hopefully that will help someone.
The attribute you want is OperationContract (on interface) / Operation Behavior (on method):
[ServiceContract]
public interface ITableProvider
{
[OperationContract]
DataTable GetTbl();
}
[OperationBehavior]
public DataTable GetTbl(){
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
Also, in the... I think service configuration... you want to specify that errors can be sent. You might be hitting an error that is something like the message size is to big, etc. You can fix that by fudging with the reader quotas and such.
By default wsHttpBinding has a receive size quota of like 65 KB, so if the serialized data table's XML is more than that, it would throw an error (and I'm 95% sure the data table is more than 65 KB with data in it).
You can change the settings for the reader quotas and such in the web.config
/ app.config
or you can set it on a binding instance in code. But yeah, that's probably what your problem is, if you haven't changed it by default.
WSHttpBindingBase Members - Look at ReaderQuotas property as well as the MaxReceivedMessageSize property.