Если в вашем 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, это будет означать, что соединение было потеряно и пользователю необходимо повторно подключиться (повторно войти в систему);