Когда вы устанавливаете соединение с клиента, вы должны установить два значения тайм-аута в вашей привязке tcp (привязка, которую вы передадите в ClientBase <> или DuplexClientBase <>):
NetTcpBinding binding = new NetTcpBinding();
binding.ReceiveTimeout = TimeSpan.FromHours(20f);
binding.ReliableSession.InactivityTimeout = TimeSpan.FromHours(20f);
Мой образец использует 20 часов для тайм-аута, вы можете использовать любое значение, которое имеет смысл для вас. Затем WCF попытается сохранить подключение вашего клиента и сервера в течение этого периода времени. Значение по умолчанию относительно короткое (возможно, 5 минут?) И может объяснить, почему ваше соединение разорвано.
Всякий раз, когда возникает проблема со связью между клиентом и сервером (включая сам WCF, отбрасывающий канал), WCF вызывает в клиенте событие Faults, которое вы можете обработать, чтобы сделать все, что считаете нужным. В моем проекте я преобразовал свой производный объект DuplexClientBase <> в ICommunicationObject, чтобы получить удержание события Faulted и перенаправить его на событие OnFaults, которое выставлено в моем классе:
ICommunicationObject communicationObject = this as ICommunicationObject;
communicationObject.Faulted +=
new EventHandler((sender, e) => { OnFaulted(sender, e); });
В приведенном выше фрагменте кода this
является экземпляром моего типа клиента WCF, который в моем случае является производным от DuplexClientBase <>. То, что вы делаете в этом событии, зависит от вашего приложения. В моем случае приложение является некритическим пользовательским интерфейсом, поэтому при возникновении ошибки WCF я просто отображаю окно сообщения для конечного пользователя и закрываю приложение - это был бы хороший мир, если бы все было так просто !