Почему возврат набора данных или таблицы данных из службы WCF не является хорошей практикой? Какие есть альтернативы?
Я работаю над университетской системой управления, в которой я использую службу WCF, а в службе я использую DataTables и DataSets для получения данных из базы данных, а база данных - это sql server.
Мои вопросы
- Является ли использование DataTables и Datasets "хорошей практикой" или "плохой практикой"?
- Если это плохо, какова альтернатива DataTable/DataSet?
- Если это плохо, каковы основные причины?
3 ответа
Возврат наборов данных из веб-сервисов обычно не считается "хорошей практикой". Проблемы были подробно описаны в следующих ссылках:
http://msdn.microsoft.com/en-us/magazine/cc163751.aspx
http://www.4guysfromrolla.com/articles/051805-1.aspx
http://msdn.microsoft.com/en-us/magazine/cc188755.aspx
Таким образом, самые большие проблемы с возвращением DataSet
кажется, что объекты из веб-сервисов связаны с производительностью сериализации, совместимостью не с.net. Кроме того, общая, полиморфная природа DataSet
как правило, высокая структура данных до времени выполнения, поэтому определение WSDL не дает полного описания сигнатуры метода. Однако, как и при любом проектном решении, вам необходимо взвесить затраты и выгоды и определить наилучшее соответствие с учетом ваших конкретных целей и ограничений.
С точки зрения альтернатив, вы можете рассмотреть возможность использования общей коллекции (например, List<yourClassHere>
) или, возможно, даже рассмотреть некоторые изменения архитектуры, чтобы разрешить использование ODATA.
Следующие ссылки предоставляют полезную справочную информацию для возврата сущностей через веб-сервисы. http://msdn.microsoft.com/en-us/library/orm-9780596520281-01-14.aspx http://www.codeproject.com/Articles/127395/Implementing-a-WCF-Service-with-Entity-Framework http://msdn.microsoft.com/en-us/data/hh237663.aspx
Есть 3 причины для неудачного типа возврата как datatable
в услугах WCF
Вы должны указать имя таблицы данных, например:
MyTable=new DataTable("tableName");
Когда вы добавляете ссылку на стороне клиента службы WCF, выберите повторно используемую DLL
system.data
Укажите атрибут на
datatable
переменная-член как[DataMember] public DataTable MyTable{ get; set; }
Я использую DataTable
в моем приложении WCF, но получаю ошибку. Так я исправил ошибку.
При возврате DataTable из веб-службы в WCF в приложение Windows Form. Я получал это исключение.
System.ServiceModel.CommunicationException: 'Произошла ошибка при получении HTTP-ответа на http://localhost:52968/MunerahService1.svc. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Смотрите журналы сервера для более подробной информации.'
Это происходило каждый раз, когда я пытался получить DataTable
Чтобы исправить исключение, мне нужно было дать DataTable
имя.
код с ошибкой
tab = new DataTable();
Исправлен код для удаления исключения
tab = new DataTable("Doctor_info");