Соединение с сокетом было прервано - CommunicationException

Первоначально:

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

Сценарий:

  • Кажется, у меня могут быть циклические ссылки в моей службе WCF, но использование «[DataContract (IsReference = true)]» не помогает исправить это.
  • Я получаю сообщение об ошибке: «Соединение сокета было прервано. Это могло быть вызвано ошибкой при обработке вашего сообщения, или превышением времени ожидания приема удаленным узлом, или проблемой базового сетевого ресурса. Тайм-аут локального сокета был '00: 01 : 00 '. "
  • Я что-то пропустил?

Код:

[DataContract(IsReference=true)]
public class Message
{
    [DataMember]
    public string TopicName { get; set; }

    [DataMember]
    public string EventData { get; set; }

    [DataMember]
    public SerializableDictionary<string, FuturesLineAsset> FuturesLineDictionary { get; set ; }
}

Мысли:

  • Интересно, это потому, что у меня есть класс FuturesAsset, у которого есть свойство типа BindableDictionary (ЭТО ПОЛЬЗОВАТЕЛЬСКИЙ ОБЪЕКТ ), и это свойство содержит список FuturesLinesAsset.
  • См. Ниже:

Родитель:

public class FuturesAsset
{
    public string AssetName { get; set; }
    public BindableDictionary<string, FuturesLineAsset> AssetLines { get; private set; }

    public FuturesAsset()
    {
        AssetLines = new BindableDictionary<string, FuturesLineAsset>();
    }

    public FuturesAsset(string assetName)
    {
        AssetLines = new BindableDictionary<string, FuturesLineAsset>();
        AssetName = assetName;
    }
}

Ребенок:

public class FuturesLineAsset
{

    public string ReferenceAsset { get; set; }
    public string MID { get; set; }
    public double LivePrice { get; set; }
    public DateTime UpdateTime { get; set; }
    public DateTime LastContributedTime { get; set; }
    public double Spread { get; set; }
    public double Correlation { get; set; }
    public DateTime Maturity { get; set; }
    public double ReferenceCurve { get; set; }

    public FuturesLineAsset(string mID, string referenceAsset, double livePrice)
    {
        MID = mID;
        ReferenceAsset = referenceAsset;
        ReutersLivePrice = livePrice;
    }
}
23
задан abatishchev 23 January 2012 в 09:58
поделиться

1 ответ

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

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

Создание высокопроизводительных служб WCF

Как ограничивать работу службы Wcf, предотвращать атаки DoS и поддерживать масштабируемость Wcf

Обновление : кроме того, в конфигурации WCF есть несколько разных тайм-аутов, и в зависимости от того, о каком клиенте или сервере вы говорите, вам нужно обновить другое предложение тайм-аута ... прочтите это о том, что каждый из них означает, и вы сможете выяснить, какой из них вам нужно увеличить. Или , вы можете просто установить каждый тайм-аут на int.max, если вам все равно, может ли вызов занять много времени для завершения.

13
ответ дан 29 November 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: