2017-01-25 8 views
2

Мне нужно определить, когда пользователи подключаются и отключаются с помощью signalr.Обнаружение при отключении пользовательского сигнала

У меня есть эти методы 2 хаба:

public void Say(string message) 
{ 
    Trace.WriteLine(message + " - " + Context.ConnectionId); 
} 

public void Goodbye(string message) 
{ 
    Trace.WriteLine(message + " - " + Context.ConnectionId); 
} 

Я реализовал Say метод, который заботится о обнаружении соединения, как так:

$.connection.hub 
      .start() 
      .done(function() { 
       hub.server.say("Hello SignalR"); 
}); 

Но как я обнаружить разъединение?

+1

$ .connection.hub.disconnected (function() {... 'на клиенте и/или переопределять' OnDisconnected (bool stopCalled) {'в хабе – stuartd

+0

@stuartd Я, похоже, не могу позвонить hub.disconnected (функция() { hub.server.goodbye ("bye"); }); не работает – frc

+0

Ну, это не работает, так как ** клиент отключен ** – stuartd

ответ

1

Добавить переопределен метод в ваш Hub класс:

public override Task OnDisconnected(bool stopCalled) 
{ 
    // do the logging here 
    Trace.WriteLine(Context.ConnectionId + ' - disconnected'); 
    return base.OnDisconnected(stopCalled); 
} 

Это будет обрабатывать и регистрировать disconects на стороне сервера, в то время как я думаю, что это не имеет особого смысла, чтобы отслеживать его на client стороне, как это маловероятно, что ваш SignalR сеанс будет прекращен со стороны сервера - see here.

Редактировать в отношении @stuartd комментарий: вы также можете переопределить

public override Task OnReconnected() 
{ 
    Trace.WriteLine(Context.ConnectionId + ' - reconnected'); 
    return base.OnReconnected(); 
} 

так что вы будете иметь возможность отслеживать случаи, когда клиент пытался подключиться к серверу и добиться успеха.

Edit # 2: Тогда вы, конечно, можете использовать тот же механизм для отслеживания из OnConnected события

public override Task OnConnected() 
{ 
    Trace.WriteLine(Context.ConnectionId + ' - reconnected'); 
    return base.OnConnected(); 
} 

Так что все кода отслеживания удобно хранится только на стороне сервера, который является более устойчивым в тех случаях, когда клиент вошел в концентратор, но по какой-то причине не смог выполнить метод, который вы используете для отслеживания зарегистрированного состояния.

+1

Клиент сторона может попытаться повторно подключиться .. – stuartd

+0

Действительно, но я не думаю, что это имеет значение. Когда этот метод так называемый серверный сервер уже рассматривает клиент как отключенный, в случае, если ему удастся повторно подключиться с клиентской стороны, он должен вызвать «public override Task OnReconnected()» класса «Hub», чтобы он мог быть зарегистрирован так или иначе, или я что-то пропустил? –

+0

При повторном чтении вопроса я согласен. – stuartd