Разъем подключения был прерван.Возможное SerializationException? - PullRequest
0 голосов
/ 25 июня 2010

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

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

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

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

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

return Channel.GetDocuments( user, criterion );

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

Ответы [ 2 ]

1 голос
/ 26 июня 2010

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

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

Клиентский прокси

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 голосов
/ 25 июня 2010

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

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

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

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

    [DataMember]
    public MyClass Parent
    {
        get;
        set;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...