WCF + EF 4.1 Проблема с загрузкой и сериализацией - PullRequest
2 голосов
/ 27 сентября 2011

Простой случай, когда моя OperationContract реализация выглядит так:

public List<Directory> GetDirectories(bool includeFiles)
{
    if (includeFiles)
    {
        return this.db.Directories.Include(e => e.Files).ToList();
    }
    else
    {
        return this.db.Directories.ToList();
    }
}

, где GetDirectories(false); работает отлично, а GetDirectories(true); выдает CommunicationObjectFaultedException с сообщением:

Объект связи, System.ServiceModel.Channels.ServiceChannel, не может быть использован для связи, потому что он находится в состоянии Failed.

Очевидно, мои File сущности имеют ссылку на Directory сущности, а Directory сущности имеют список файлов. Сначала я подумал, что это будет типичная циклическая эталонная ловушка, но я не вижу признаков этого в сообщении об исключении. Есть идеи по этой проблеме?

1 Ответ

1 голос
/ 27 сентября 2011

Это будет циклическая ловушка ссылок ( здесь - что-то об этой теме), и причина вашего CommunicationObjectFaultedException будет выглядеть примерно так:

using (var client = new ServiceClient())
{
    data = client.GetDirectories(true);
}

Причина в том, что необработанное исключение вызвало сбой канала, и using пытается вызвать Close на этом сбойном канале - это недопустимый переход в автомате состояния канала (и одна большая странность WCF), в результате чего вы упомянули исключение, которое вы упомянули , Есть много способов избежать этого, но основа:

ServiceClient client = null;

try
{
    client = new ServiceClient();
    data = client.GetDirectories(true);
}
finally
{
    if (client != null)
    {
        if (client.State == CommunicationState.Faulted) 
        {
            client.Abort();
        } 
        else 
        {
            client.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...