DataTable являются сериализуемыми, но существуют некоторые хитрости для возврата нетипизированного DataTable через WebService.
Прежде чем метод веб-службы вернет заполненный DataTable (на стороне службы), ему должно быть присвоено свойство TableName. В случае, если внутри OperationContract DataTable будет получена ссылка на типизированный DataTable, сериализация завершится неудачно с сообщением типа «messaga» «Сервер не предоставил значимого ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера ".
Это означает, что вы должны заполнить созданный DataTable, например, используя метод Merge (или вручную). Вот такой пример реализации DataContract;
DataTable IHorizonCLService.RetrieveChangeLog(int iId)
{
DataTable dt = new DataTable(); //create new DataTable to be returned by this web method
dt.Merge(HorMan.RetrieveChangeLog(iId)); //get typed DataTable and fills the DataTable
dt.TableName = "SurChangeLogHor"; //assigns name
return dt;
}