WCF: The underlying connection was closed

В одном из проектов, которым я сейчас занят, появилась странная ошибка - при обращении к одному из методов сервиса WCF, вылетает "The underlying connection was closed: The connection was closed unexpectedly". В самом сервисе необработаных ошибок нет (по крайней мере, ClrDbg их не показывает). После небольшого поиска нашел достаточно интересную причину ошибки:
  1. Метод, который приводил к ошибке имеет следующую сигнатуру:

    DataSet GetObject(long id);

  2. В своей реализации, метод создает типизированный датасет, разный, в зависимости от типа объекта и возвращает его клиенту. Важный момент - формальный результат фунции -  DataSet, а фактический - какой-нибудь SuperDataSet.
  3. Оказываеться, в этом случае что-то ломается в сериализации DataSet-а и в том как этим пользуется WCF, что и приводит к вышеописанному поведению.
Как это чинить:

Простейший способ починить - скопировать содержимое типизированого DataSet-а в нетипизированный, перед возвратом.

[OperationContract]
DataSet GetObject(long id) {
SuperDataSet ds = new SuperDataSet();
// заполняем SuperDataSet
....
....
DataSet res = new DataSet();
res.Merge(ds);
return ds;
}
Некрасиво, но работает.

Коментарі

Anastácio Soberbo каже…
Адміністратор блогу видалив цей коментар.
Іван каже…
У мене була інша проблема:
якщо додаю в сервіс контракт новий метод, що повертає датасет, то при генерації клієнтського проксі коду за допомогою svcutil.exe в згенерованому файлі дещо міняється, в тому числі зникає namespace.
Старий клієнтський код перестає збиратись.

Я вирішив цю проблему некрасивим способом, але думаю, що потрібно відмовитись від використання svcutil.exe.

А ви використовуєте svcutil.exe чи клієнт бере длл з серверними інтерфейсами/контрактами і вручну будує конекцію до потрібного сервера/сервіса?
Unknown каже…
Найчастіше прямо в студії натискаю "Add Service Reference" і цього достатньо. Рідше - svcutil.
Мені подобається брати DLL з серверними інтерфейсами/контрактами, та деколи обходжусь і без них. Коротше - буває по різному.
Kalinets' family каже…
чего-то не понял, а что ломается в сериализации датасета?
Unknown каже…
К сожалению, подробнее чем осветил в посте проблемой не владею.
Анонім каже…
У меня была такая проблема с возвратом таблицы. Решилась присвоением таблице имени. На форумах народ пишет, что возвращаемые таблицы именовать непременно нужно. Возможно, стоит попробовать присвоить имя датасету.
Unknown каже…
Возможно я не совсем понял совет, но ведь в типизированом датасете и так все таблицы именованы. Разве нет?

Популярні дописи з цього блогу

OAuth-аутентификация через ВКонтакте

Українська мова