2010-06-25 3 views
0

Я получаю это сообщение об ошибке при попытке вернуть данные из службы WCF. .Соединение сокета было прервано. Возможное исключение SerializationException?

«Подключение гнездо было прервано Это может быть вызвано ошибкой обработки ваше сообщение или получить тайм-аут превышены на удаленном хосте, или основной вопрос ресурсов сети Локальный тайм-аут сокета был '00:. 00: 59.9960000 '"

Это неверное определение, так как оно показывает ~ 59 секунд, но исключение составляет около 2 секунд. В последний раз, когда я получил это сообщение об ошибке, он имел отношение к бесконечному циклу, вызванному сериализацией объектов инфраструктуры сущности. К счастью, я только что внес изменения, так что было легко заметить.

На этот раз я не знаю, что изменилось, чтобы вызвать это. Я различал классы инфраструктуры сущности, чтобы узнать, что никаких изменений не было. Насколько я знаю, база данных также осталась прежней, хотя я не знаю, как это доказать, поскольку она довольно большая.

Если я пройду через код WCF с помощью отладчика, я вижу, что он правильно собирает данные. Он даже пытается вернуть информацию. Но, в стороне клиента прокси я получаю исключение на эту строку кода:

return Channel.GetDocuments(user, criterion);

ли кто-нибудь есть какие-либо понять или инструменты, которые могут помочь мне отследить это исключение?

ответ

1

Я нашел проблему. Это связано с удалением столбца из базы данных, и модели фреймворка сущности не были обновлены. Я уже не думал о круговой петле.

Вот трюк, который указал мне в правильном направлении.

Client Side Proxy

public List<ImageData> GetDocuments(User user, DocumentSearchCriterion criterion) 
{ 
    Channel.GetDocuments(user, criterion); 
} 

WCF Side Service

public List<ImageData> GetDocuments(User user, DocumentSearchCriterion criterion) 
{ 
    List<ImageData> documents = new DocumentRepository().GetDocuments(user, criterion); 

    // Temporary test to see if we can serialize the data. This is only for debugging 
    // purposes and needs to be removed from production code. 
    DataContractSerializer serializer = new DataContractSerializer(documents.GetType()); 
    using(FileStream stream = new FileStream("SerializerOutput.xml", FileMode.Create)) 
    { 
     // This line will give an exception with useful details while debugging. 
     serializer.WriteObject(stream, documents); 
    } 

    return documents; 
} 

Надежда, что помогает кто-нибудь еще с этим родовым и вводящей в заблуждение исключения.

0

Проверьте следующее:

  1. У вас есть много данных, так что вам нужно, чтобы продлить время ожидания в вашем .config файл
  2. Скорее всего, в моем опыте в том, что у вас есть циклическая ссылка в типе вы возвращаетесь из функции WCF.

так что если у вас есть класс, который имеет что-то вроде этого, WCF будет несчастна

[DataContract] 
public class MyClass 
{ 
    public ChildObject(int i) 
    { 
    } 

    [DataMember] 
    public MyClass Parent 
    { 
     get; 
     set; 
    } 
} 
+0

Я также подозреваю, что это круговая ссылка. У вас есть умный способ найти, кто «DataMember» является виновником? Я просмотрел свойства, и ничего «очевидного» не выпрыгивает. –

+0

Я ищу две вещи .... 1. Тип возврата, который имеет тот же тип, что и вызывающий. 2. Обычно это то, что есть ... свойство, которое является классом, который имеет свойства, и один из них имеет тот же тип, что и родительский где-то в графе объектов. Никакой трюк, о котором я не знаю, хотя и с моей головы. –

Смежные вопросы