Есть сервер и клиент.
Используется для соединения след. настройки:
NetTcpBinding(SecurityMode.None, true);
tcp.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
tcp.Security.Transport.ProtectionLevel = ProtectionLevel.None;
Интерфейс-контракт сервера описан так:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ISecretaryService))]
public interface IBossService
......
Его реализация:
[ServiceBehavior( IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class BossService : IBossService
.....
как видно это синглетон.
Реализация интерфейса клиента так :
[CallbackBehavior(IncludeExceptionDetailInFaults = true)]
public class SecretaryService : ISecretaryService
...
По сути сервер запускается и ожидает метод Join(User user) ---> [OperationContract(IsInitiating = true, IsTerminating = false, IsOneWay = false)]
На сервере объект User добавляется в коллекцию подключенных пользователей у которых я так же запоминаю user.SecretaryCallbackService = OperationContext.Current.GetCallbackChannel<ISecretaryService>();
скажите в каком порядке надо подписываться, обрабатывать и на какие вообще надо подписываться события? ведь есть и ServiceHost и ServiceEndPoint и (IChannel)BossService.. у всех есть события closed, faulted и т.д.
аналогично и на другой стороне — есть DuplexChannelFactory, есть InstanceContext, есть (IChannel)ISecretaryService и т.д.
Требование такое, чтоб сервер не падал и кдалял из списка подключенных пользователей(и писал это в некую историю) пользователей которые либо сами коректно закрыли соединение либо была нарушена связь и корректно ожидать новых соединений.
и соотв. чтоб на клиенте я мог обнаружить отвалившегося сервера (закрыли или проблемы с сетью) и корректно выполнять переподключение через заданые промежутки времени.