10 May 2008
Типізований DataSet як параметер WCF Сервісу
Так бува і таке. Навіть R&D проекти мають проблеми з архітектурами, та пост не про це...
Отже, якщо є веб-сервіс (WCF) який повертає не типізований DataSet(тобто в контракті просто клас DataSet), а потрібно повернути саме типізований то:
The underlying connection was closed: The connection was closed unexpectedly.
Обожнюю такі масаги :). Але це з боку клієнту.
Якщо подивитися з боку сервісу, то месага набагато зрозуміліша.
There was an error while trying to serialize parameter http://tempuri.org/:DoWork3Result. The InnerException message was 'Type 'TryWCFAndDataSet.DataSet1' with data contract name 'DataSet1:http://schemas.datacontract.org/2004/07/TryWCFAndDataSet' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.
Перше рішення проблеми зрозуміло з пояснення до помилки, але для мене немає жодної потреби в типізованому датасеті. А тому і бажання робити залежність від датасетів - теж(+ ще на додачу ускладнений WSDL та відповідно генерований проксі). Отже декілька альтернатив.
1) Налаштувати XML серіалізацію. Для цього потрібно маркувати метод контракту за допомогою XmlSerializerFormat, це проінструктує серіалайзер використовувати IXmlSerializable. А тут в DataSet все добре. А отже і на клієнті буде все добре.
[OperationContract]
[XmlSerializerFormat]
DataSet DoWork3();
2) Другий метод, це просто копіювати кожну таблицю DataSeta в новий DataSet, відповідно просто отримати не типізований датасет з усіма данними. Можна ще покопіювати додаткову інфу, на кшталт, відносин між таблицями, культури, тощо. Як реалізовувати цей метод схоже розповідати не треба ;) ...
Вчу українську, багато працюю. Цікавлюсь моделюванням небезпек. Більшість часу витрачаю на .Net.