У меня есть служба WCF, которая использует LinqToSql DataContext для извлечения некоторой информации из базы данных. Тип возврата операции IEnumerable <DomainObject
>, и у меня есть вспомогательный метод, который преобразует объект LINQ, полученный из таблицы, в контракт данных WCF, например:
[OperationContract]
public IEnumerable<DomainObjectDTO> RetrieveDomainObjects()
{
var context = CreateDataContext();
return from domainObject in context.DomainObjects
select ConvertDomainObject(domainObject);
}
private DomainObjectDTO ConvertDomainObject(DomainObject obj)
{
// etc...
}
Этот код демонстрирует странное поведение, если я передаю неверную строку соединения в DataContext. Будучи не в состоянии найти правильную базу данных, предположительно приведенный выше код генерирует исключение SqlException при перечислении IEnumerable <DomainObjectDTO
>, когда происходит сериализация. Однако, когда я запускаю этот код в моем отладчике, я не вижу исключений первого шанса на стороне сервера! Я сказал отладчику на вкладке «Исключения» разбить все сгенерированные исключения CLR, а он просто этого не делает. Я также не вижу характерного сообщения «Первое исключение» в окне «Вывод».
На стороне клиента я получаю сообщение CommunicationException с сообщением об ошибке в виде строки «Соединение с сокетом было неожиданно прервано». Ни одно из внутренних исключений не дает никаких указаний на первопричину проблемы.
Единственный способ понять это - переписать код LINQ таким образом, чтобы выражение запроса оценивалось внутри метода OperationContract. Кстати, я получаю тот же результат, если есть проблема с разрешениями или если я обертываю DataContext в операторе using, так что он не просто изолирован от SqlExceptions.
Не принимая во внимание нежелательность создания возвращаемого типа в качестве IEnumerable <T
> и только перечисление запроса где-то в глубине сериализатора, подавляет ли WCF или каким-то образом предотвращает появление исключений в этом случае? И если да, то почему?