WCF- «Базовое соединение было закрыто: соединение было неожиданно закрыто» - PullRequest
5 голосов
/ 21 мая 2010

Я получаю это удивительно неоднозначное сообщение об ошибке при использовании одного из моих веб-методов на моем веб-сервисе WCF. Поскольку это сообщение об ошибке не дает никаких объяснений, что позволяет мне опубликовать мою теорию.

Я полагаю, что это может иметь отношение к типу возвращаемого значения, которое я использую

У меня есть библиотека типов, которая указана как в веб-сервисе, так и в клиенте. В этой DLL находится базовый класс ExceptionMessages. Существует дочерний элемент этого класса, который называется DrawingExcepions.

Вот код:

public class ExceptionMessages
{
    public object[] ReturnValue { get; set; }
}

public class DrawingExceptions : ExceptionMessages
{
    private List<DrawingException> des = new List<DrawingException>();
}

public class DrawingException
{
    public Exception ExceptionMsg { get; set; }
    public List<object> Errors { get; set; }
}

Используемый код:

    [OperationContract]
    ExceptionMessages createNewBom(Bom bom, DrawingFiles dfs);

    public ExceptionMessages createNewBOM(Bom bom, DrawingFiles dfs)
    {
            return insertAssembly(bom, dfs);
    }

    public DrawingExceptions insertAssembly(Bom bom, DrawingFiles dfs)
    {
        DrawingExceptions des = new DrawingExceptions();

        foreach (DrawingFile d in dfs.drawingFiles)
        {
            DrawingException temp = insertNewDrawing(bom, d);
            if (temp != null)
                des.addDrawingException(temp);

            if (d.Child != null)
                des.addDrawingException(insertAssembly(bom, d.Child));
        }

        return des;
    }

Возврат к:

    ExceptionMessages ems = client.createNewBom(bom, currentDFS);

    if (ems is DrawingExceptions) { }

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

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

Если требуется дополнительная информация, просто спросите:)

Спасибо.

Ответы [ 4 ]

4 голосов
/ 21 мая 2010

Да, это сообщение великолепно:)

Мне часто бывает полезно включить трассировку, как описано в этой статье . Взгляните на раздел «Рекомендуемые настройки для развертывания или отладки».

2 голосов
/ 20 марта 2012

У меня была та же проблема, и я нашел этот пост в качестве возможного решения ошибки тайм-аута, которая была у моей службы WCF. В моем случае ответ Сквига предложил подсказку относительно основного состояния. Хотя размер максимальной полезной нагрузки легко увеличить, это, очевидно, вариант с последствиями для производительности.

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

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

Надеюсь, это поможет кому-то еще!

2 голосов
/ 19 октября 2011

Я получал эту ошибку при возврате большой полезной нагрузки. Оказалось, что DataContractSerialiser останавливает средний поток, поскольку он достиг значения по умолчанию maxItemsInObjectGraph, добавление фоллинга в мое поведение конечной точки устранило проблему.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />
0 голосов
/ 21 сентября 2012

У меня только что возникла та же проблема, однако ни один из приведенных выше ответов не решил проблему.

Я возвращал список объектов LINQ, база данных правильно настроила все связи, что заставляет объекты автоматически связываться с LINQ ... Это мешало выполнению запроса.

Я решил это, удалив связи из LINQ DBML

...