WCF Попытка получить коллекцию приводит к сбою клиента - PullRequest
0 голосов
/ 10 августа 2011

Я играл с WCF вместе с EF и столкнулся с проблемой отправки коллекций.

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

[OperationContract]
IEnumerable<Company> GetAllCompanies();

Реализовано в моем сервисе, как:

public IEnumerable<Company> GetAllCompanies()
{
    using (var ctx = new InleerAppContext())
    {
        return ctx.Company.ToList();
    }
}

Ничего необычного, и так как отправка объектов, казалось, работала нормально, я ожидал, что это тоже будет работать. Однако при вызове GetAllCompanies () из моего клиента:

var result2 = service.GetAllCompanies();
foreach (Company c in result2)
{
    Console.WriteLine(c.Name);
}

Возникает исключение CommunicationException:

Произошла ошибка при получении ответа HTTP на http://localhost:8080/. Это может быть связано с конечной точкой службы привязка без использования протокола HTTP. Это также может быть связано с HTTP контекст запроса прерывается сервером (возможно, из-за сервис выключен). Подробнее смотрите в журналах сервера.

С дополнительной информацией:

в System.Net.HttpWebRequest.GetResponse ()
в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan Тайм-аут)

Я уже изменил тайм-аут на 30 минут как на клиенте, так и на сервере, используя настраиваемую конфигурацию привязки (которая является базовой для HttpBinding с обеих сторон):

<bindings>
  <basicHttpBinding>
    <binding name="longTimeoutBasicHttpBinding"
             receiveTimeout="00:30:00" 
             sendTimeout="00:30:00">          
    </binding>
  </basicHttpBinding> 
</bindings>

Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Скорее всего, у вас проблема с циклической ссылкой. Когда WCF пытается сериализовать ваш экземпляр Company, он касается каждого свойства и запускает отложенную загрузку связанного объекта, а также сериализует его, но если у объекта есть свойство обратной навигации, он будет следовать за ним и снова сериализировать компанию в бесконечном цикле.

Есть только два способа решить эту проблему:

  • Отключить отложенную загрузку (или создание всего прокси) - используйте ctx.ContextOptions. Также не загружайте отношения с Include
  • Удалить / решить циклическую зависимость - это необходимо, если вы хотите также сериализовать отношения
0 голосов
/ 10 августа 2011

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

...