Intereting Posts
Зависимое свойство в ссылочной привязке сопоставляется с столбцом, созданным магазином Получить все ассоциированные / составные объекты внутри объекта (абстрактным способом) доступ к переменной c # в файле javasciprt .js конвертировать msi в exe с помощью командной строки … Преобразование разных форматов DateTime в определенный формат String Как рисовать кольцо (пончик) с помощью GDI +? Изменение разрешений папок C ++ / CLI: предотrotation сбора мусора в управляемой оболочке неуправляемого ресурса Почему допустимо «длинное значение» равным нулю? Удалить префикс «api» из URL-адреса веб-API System.IO.IOException: рукопожатие не удалось из-за непредвиденного формата пакета? Проверить файл шаблона слова Проверка параметров модели домена DDD Исключить тип из проверки модели (пример DbGeography), чтобы исключить IsufficientExecutionStackException Свойство «Претензии» типа «AspNetUser» не является навигационным свойством

Соединение сокета было прервано – 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 FuturesLineDictionary { get; set ; } } 

Мысли:

  • Интересно, это потому, что у меня есть class FuturesAsset, который имеет свойство типа BindableDictionary (ЭТО ТАМОЖЕННЫЙ ОБЪЕКТ), и это свойство содержит список FuturesLinesAssets.
  • Увидеть ниже:

родитель:

 public class FuturesAsset { public string AssetName { get; set; } public BindableDictionary AssetLines { get; private set; } public FuturesAsset() { AssetLines = new BindableDictionary(); } public FuturesAsset(string assetName) { AssetLines = new BindableDictionary(); 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; } } 

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

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

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

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

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

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

  • Объекты, используемые в качестве параметров или возвращаемых типов в вашем контракте, не имеют конструкторов без параметров и не украшены атрибутом DataContract. Проверьте classы, используемые в качестве параметров или возвращаемых типов, а также все типы, используемые общедоступными свойствами этих classов. Если вы реализуете конструктор с параметрами для одного из этих classов, компилятор больше не будет добавлять конструктор без параметров по умолчанию, поэтому вам нужно будет добавить это самостоятельно.
  • Ограничения по умолчанию, определенные в конфигурации службы, слишком низки (MaxItemsInObjectGraph, MaxReceivedMessageSize, MaxBufferPoolSize, MaxBufferSize, MaxArrayLength).
  • Некоторые общедоступные свойства ваших объектов DataContract доступны только для чтения. Убедитесь, что все общедоступные свойства имеют как получатели, так и сеттеры.

Возникла эта проблема с длительным процессом инициализации, который вызывался из события OnStart установщика Windows Service Host. Исправлено установкой режима безопасности и тайм-аутов для привязки TCP.

  // Create a channel factory. NetTcpBinding b = new NetTcpBinding(); b.Security.Mode = SecurityMode.Transport; b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; b.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign; b.MaxReceivedMessageSize = 1000000; b.OpenTimeout = TimeSpan.FromMinutes(2); b.SendTimeout = TimeSpan.FromMinutes(2); b.ReceiveTimeout = TimeSpan.FromMinutes(10); 

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

Эта проблема также может быть вызвана не очисткой клиента WCF, когда вы его используете. В нашей системе мы используем одноразовый шаблон вместе с переносом всех вызовов функций в систему, чтобы обеспечить правильную очистку и протоколирование. Мы используем версию следующего classа:

  public class WcfWrapper : IDisposable { private readonly OperationContextScope _operationContextScope; private readonly IClientChannel _clientChannel; public WcfWrapper(IClientChannel clientChannel) { _clientChannel = clientChannel; _operationContextScope = new OperationContextScope(_clientChannel); } public void Dispose() { _operationContextScope.Dispose(); } public T Function(Func func) { try { var result = func(); _clientChannel.Close(); return result; } catch (Exception ex) { KTrace.Error(ex); _clientChannel.Abort(); throw; } } public void Procedure(Action action) { try { action(); _clientChannel.Close(); } catch (Exception ex) { KTrace.Error(ex); _clientChannel.Abort(); throw; } } } } 

Каждый вызов WCF, который мы вводим в нашу службу, осуществляется через определенный class интерфейса, такой как следующий:

  public sealed class WcfLoginManager : ILoginManager { private static LoginManagerClient GetWcfClient() { return new LoginManagerClient( WcfBindingHelper.GetBinding(), WcfBindingHelper.GetEndpointAddress(ServiceUrls.LoginManagerUri)); } public LoginResponse Login(LoginRequest request) { using(var loginManagerClient = GetWcfClient()) using (var slice = new WcfWrapper(loginManagerClient.InnerChannel)) { DSTicket ticket; DSAccount account; return slice.Function(() => new LoginResponse(loginManagerClient.Login(request.accountName, request.credentials, out ticket, out account), ticket, account)); } } } 

Используя этот шаблон, все вызовы WCF в систему обертываются либо методом Function, либо методом Procedure, что позволяет им сначала обеспечить ведение журнала при всех ошибках, а во-вторых, чтобы гарантировать, что канал закрыт, когда ошибки не произойдут, а прерваны, если произойдет исключение , Наконец, поскольку он используется в заявлении using, вызывается окончательное удаление канала. Таким образом, будут предотвращены ошибки, возникающие из-за неправильной очистки каналов, которые будут выглядеть как эта ошибка.

Ошибка WCF:

Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был …

где указанные таймауты очень близки к 1 00:00:59.9680000 (например, 00:00:59.9680000 ) или точно 1 минуту (т.е. 00:01:00 ), может быть вызвано слишком большим сообщением и превышением настроек привязки .

Это можно устранить, увеличив значения в файле конфигурации, например:

  

(только примерные значения, вы можете настроить их).