Ответ 1
Одним довольно простым способом справиться с этим было бы присвоение каждому сообщению идентификатора, который увеличивается с каждым сообщением. Клиент должен будет отслеживать последнее сообщение, которое он получил, и при повторном подключении просто отправит этот идентификатор сообщения на сервер; и тогда сервер должен будет отправить все пропущенные сообщения клиенту. Должно быть разумно просто реализовать.
EDIT: Я не думаю, что вам нужно было бы поддерживать какое-либо реальное состояние на сервере - я думаю, что почти все это может быть вытолкнуто в ваш хранилище данных или вашему клиенту. Клиент отправил бы идентификатор или метку последнего сообщения, которое он получил:
$.connection.myHub.server.updateMe(lastMessageId);
Вам нужен какой-то резервный хранилище данных - поэтому, когда сервер получит сообщение updateMe()
, он выполнит запрос в базе данных и вытащит все строки с идентификатором, большим, чем тот, который он только что получил. Он возвращает их клиенту как часть возвращаемого значения его метода updateMe()
. И тогда он попытается доставить любые новые сообщения, которые поступают так же, как обычно, путем вызова методов на клиенте.
Что касается безгражданства, являющегося целью SignalR: я не могу прокомментировать это, не замечая, что я не могу представить какое-либо достаточно сложное приложение реального мира, которое не нужно было бы иметь какое-то вспомогательное хранилище данных, независимо от того, он в SignalR или какой-либо другой структуре (WCF, XSockets и т.д.) не имеет большого значения.