Как перехватить клиентские подключения и отключения на стороне сервера? - PullRequest
0 голосов
/ 25 сентября 2011

Я написал сервер / клиент, используя WCF (net.tcp). Теперь я хочу перехватить подключения и отключения клиента на стороне сервера.

1 Ответ

0 голосов
/ 25 сентября 2011

Если в вашем WCF встроена аутентификация с небольшими изменениями, это может быть достигнуто.

Вы создаете 2 метода в службе (Connect, Disconnect), где Connect - это первое, что вызывается клиентом при запуске (или входе в систему), а Disconnect - последний метод, выполняемый клиентом.На сервере вы регистрируете соединения / разъединения с базой данных или любым другим хранилищем по вашему выбору.

Это просто и делает то, что вам нужно.Однако, если клиентское приложение завершается с неожиданным исключением или возникают проблемы с сетью, вы не будете знать, что это произошло.Вот почему я бы добавил на сервер другой метод, который называется Refresh.Как это будет работать - каждый раз, когда клиент вызывает соединение, вы запускаете фоновый поток на таймере и запускаете обновление каждые 5 минут.Таким образом, ваша серверная сторона регистрирует активность клиента по крайней мере каждые 5 минут.Также я хотел бы создать службу Windows, работающую на сервере по таймеру каждые 10 минут, и если есть какое-либо не обновленное соединение, оно создает принудительное разъединение.

Так вот как будет работать код высокого уровня на сервере:

  [DataContract]
public class Session
{
    public string UserName { get; set; }
    public byte[] passwordHash { get; set; }
    public Guid sessionGuid { get; set; }
}

        public bool Connect(Session sessionObject)
    {
        if (GetOpenSession(sessionObject.sessionGuid) == null)
        {
            if (CreateNewSession(sessionObject)) return true; else return false;

        }
        else
        {
            CloseSession(GetOpenSession(sessionObject.sessionGuid));
            if (CreateNewSession(sessionObject)) return true; else return false;
        }
    }

    public void Disconnect(Guid sessionGuid)
    {
        if (GetOpenSession(sessionGuid) != null)
        {
            CloseSession(GetOpenSession(sessionGuid));
        }
    }

    public bool Refresh(Guid sessionGuid)
    {
        if (GetOpenSession(sessionGuid) != null)
        {
            UpdateSession(sessionGuid);
            return true;
        }
        else
        {
            return false; 
        }
    }

На клиенте, если Connect или Refresh возвращают false, это будет означать, что соединение было потеряно и пользователю необходимо повторно подключиться (повторно войти в систему);

...