У меня есть служба WCF, которая использует DataContext LinqToSql для извлечения некоторой информации из базы данных. Тип возврата операции является IEnumerable <DomainObject
>, и у меня есть вспомогательный метод, который преобразует из таблицы происхождения объекта LINQ к контракту данных WCF следующим образом:Предотвращает ли 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 или каким-то образом предотвращение исключения исключений из этого случая? И если да, то почему?