2015-06-02 1 views
0

Я пытаюсь выполнить отправку данных в мои клиентские методы из метода контроллера, который возвращает ответ, когда клиент экземпляра отключен.Сигнал R - Обработка разъединения вне концентратора

контроллер В настоящее время ..

public void SomeMethod(){ 
    IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

    while(true){ 
     hubContext.Clients.All.addNameValue(name,value); 
    } 
} 

Что я хотел бы ..

bool someProperty = false 
public string SomeMethod(){ 
    IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

    while(true & (someProperty == false)){ 
     hubContext.Clients.All.addNameValue(name,value); 
    } 
    return "done"; 
} 

, поскольку мы знаем, что клиент отключается от концентратора перекрытой методы ..

Hub

public override Task OnDisconnected(bool stopCalled = true) 
    { 
     Console.WriteLine("Hub Disconnected: {0}\n", Context.ConnectionId); 
     return (base.OnDisconnected(stopCalled)); 
    } 

Есть ли какой-либо способ со стороны хаба, чтобы отслеживать экземпляр контроллера, чтобы можно было что-то подобное сделать?

public override Task OnDisconnected(bool stopCalled = true) 
    { 
     SomeClass.someProperty = true; 
     Console.WriteLine("Hub OnDisconnected {0}\n", Context.ConnectionId); 
     return (base.OnDisconnected(stopCalled)); 
    } 

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

ответ

0

Если вы создаете концентратор, который использует одноэлементный класс для отслеживания ваших клиентов, тогда вам нужно будет хранить все подключенные клиенты, чтобы иметь возможность повторно подключаться, когда сервер возвращается в Интернет. На клиенте действительно нет события разъединения, а только связанное событие. Поэтому трудно определить, отключен ли сервер или нет. Способ, которым я работаю, - подписаться на событие connection.closed. Для меня я пытаюсь повторно подключиться, это не удается, я уведомляю пользователя и выхожу из приложения. Для получения информации об однотонном методе отслеживания клиентов я разработал месторождение по этой ссылке: http://www.asp.net/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

 tcHubProxy(HubConnection hubConnection, StreamWriter writer) 
    { 
     mhubConn = hubConnection; 
     mIHubProxy = hubConnection.CreateHubProxy("CentralHub"); 
     mWriter = writer; 
     mWriter.AutoFlush = true; 

     try 
     { 
      mhubConn.TraceLevel = TraceLevels.All; 
      mhubConn.TraceWriter = mWriter; 
      mhubConn.Closed += MhubConnOnClosed; 
      mhubConn.Start().Wait(); 
      LogEvent(DateTime.Now, "Info", "Client Connected"); 
      mIHubProxy.On<List<User>>("updateFmds", GetUserFmds); 
      connected = true; 
     } 
     catch (Exception e) 
     { 
      if (showMessage) 
      { 
       MessageBox.Show(
        "There is currently no connection to the server, this application will close, if this issue persists check your network connection or contact support.", 
        "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       showMessage = false; 
      } 
      connected = false; 
      showMessage = false; 
     } 
    } 

public void MhubConnOnClosed() 
    { 
     LogEvent(DateTime.Now, "Info", "Client connection to communication hub, attempting to redirect."); 
     try 
     { 
      mhubConn = new HubConnection(ConnectionString); 
      mhubConn.TraceLevel = TraceLevels.All; 
      mhubConn.TraceWriter = mWriter; 
      mIHubProxy = mhubConn.CreateHubProxy("CentralHub"); 
      mhubConn.Start().Wait(); 
      LogEvent(DateTime.Now, "Info", "Reconnection successful."); 
      mIHubProxy.On<List<User>>("updateFmds", GetUserFmds); 
     } 
     catch (Exception e) 
     { 
      LogEvent(DateTime.Now, "Error", "Reconnection attempt failed.", e.StackTrace, e.Message); 
      if (showMessage) 
      { 
       MessageBox.Show(
        "There is currently no connection to the server, this application will close, if this issue persists check your network connection or contact support.", 
        "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       showMessage = false; 
      } 
      connected = false; 
     } 
    }