Могу ли я сериализовать таблицу данных или набор данных для передачи через веб-сервис в C #? - PullRequest
11 голосов
/ 18 февраля 2009

Я использую веб-сервис для запроса данных из таблицы. Затем я должен отправить его пользователю, который хочет это как DataTable. Могу ли я сериализовать данные? Или я должен отправить его как набор данных. Я новичок в веб-службах, поэтому я не уверен, лучший способ сделать это.

Ответы [ 8 ]

9 голосов
/ 18 февраля 2009

Вы можете отправить данные в виде строки XML из набора данных по DataSet.GetXml()

И чем пользователь может десериализовать его с помощью DataSet.ReadXml()

И получить данные из набора данных по DataSet.Tables

Удачи

7 голосов
/ 18 февраля 2009

См. этот пост Ричарда Блеветта по причинам, почему вы, вероятно, не захотите этого делать.

EDIT: Подводя итог вышесказанному:

  • Использование DataSet не совместимо. Он использует аннотации, которые имеют смысл только тогда, когда каждый конец ссылки использует стек Microsoft.
  • DataSet - довольно неэффективный класс для отправки данных по сети - он также содержит данные отслеживания изменений и метаданные.
  • Он вводит тесную связь - изменения, сделанные на стороне обслуживания, которые могут даже не понадобиться клиенту, должны отражаться и на стороне клиента.
7 голосов
/ 18 февраля 2009

Если вы выставите его как DataSet / DataTable, он все равно будет выполнять свою собственную сериализацию (через IXmlSerializable, IIRC). Обратите внимание, что DataSet / DataTable не подходит для хороших типов данных в веб-сервисах, если вы хотите, чтобы сервис был переносимым на другие паттерны (например, клиент Java и т. Д.). Но вы можете просто выставить его таким, если хотите ...; .NET будет заниматься переводом.

5 голосов
/ 18 февраля 2009

Конечно. Оба DataTable и DataSet являются сериализуемыми, и они также имеют функции ReadXml () и WriteXml (), которые вы также можете использовать.

2 голосов
/ 05 мая 2011

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;
}
1 голос
/ 26 апреля 2012

Просто интересное замечание от здесь

И никогда, никогда, никогда не отправляйте экземпляр System.Data.DataSet по сети. Никогда не было, нет и никогда не будет причин отправлять какие-либо экземпляры этого типа куда-либо. Это за грандиозный объем и делает объект передачи данных 10000 свойств кажется легковесным. Тот факт, что что-то сериализуемо, не означает, что это должно быть.

1 голос
/ 18 февраля 2009

Самый простой и совместимый способ - сериализовать набор данных в XML с помощью метода GetXml (), а затем передать его в виде строки из веб-службы. Затем клиент может десериализовать его с помощью метода ReadXml ().

Мы использовали сервис, который сделал это таким образом, и он работал отлично.

Альтернативой является предоставление класса DataSet в сервисе и возврат объекта набора данных. Но это усложнит ситуацию, особенно если любой клиент должен быть не .NET.

1 голос
/ 18 февраля 2009

Вы можете передавать DataTable через веб-сервис. Так что это, вероятно, ваш лучший вариант, потому что это то, что просил клиент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...