2013-06-19 12 views
0

У меня есть приложение asp.net mvc 4, которое использует SignalR.SignalR OnConnected вызывается несколько раз

Когда пользователь подключен, я хочу уведомить каждого об этом (на данный момент отправить на «все» только для его проверки). В моем CLAS Hub у меня есть это:

public override System.Threading.Tasks.Task OnConnected() 
    { 
     NotifyAllOfUserLogin(); 
     return base.OnConnected(); 
    } 

В _layout.cshtml, у меня есть это:

 <script type="text/javascript"> 
     $(document).ready(function() { 
      var proxy = $.connection.messagehub; 

      proxy.client.messageAll = function (message) { 
       $('#messages').prepend('<p style=\'white-space:pre;\'>' + message + '</p><br />'); 
      }; 

      $("#btnSubmitMessage").click(function() { 
       proxy.server.messageAll($("#txtMessage").val()); 
       $("#txtMessage").val(''); 
      }); 

      $.connection.hub.start(); 
     }); 
    </script> 

Хотя это работает, я думаю, что пишу это в MasterPage является ошибкой, так как ступица соединение будет повторно инициализировано для каждой страницы, наследующей мастер, поэтому OnConnected будет называться много раз.

Как я должен правильно разобраться, вызывая OnConnect только тогда, когда пользователь входит в приложение, а onDisconnected, когда пользователь выходит из системы?

ответ

3

Для каждой загрузки страницы создается новое соединение. Когда эта страница закрыта, аналогично закрывается конкретное соединение.

Что вы хотите сделать, это отслеживать идентификаторы соединения пользователя на стороне сервера. Вам нужно будет отслеживать активные подключения, связанные с каждой конкретной учетной записью пользователя, а также при отключении. При этом вы можете уведомить всех пользователей о том, что человек подключен, если ранее не было существующих идентификаторов активного соединения, связанных с этим пользователем.

+0

Так что на самом деле нормально иметь $ .connection.hub.start(); вызванный в masterpage, потому что все управляется через идентификатор соединения? спасибо, это начинает иметь смысл. –

+1

Да, это нормально. Все зависит от того, как вы хотите обрабатывать соединения с концентратором SignalR. Просто имейте в виду, что каждая страница в вашем приложении приведет к подключению/отключению на странице. – SeanPrice

+0

Я также заметил связь/разъединение на каждой странице - очевидно, потому что я делаю все это на главной странице, но если вы имеете в виду, что я не должен беспокоиться об этом, так как это не проблема, тогда нормально –

Смежные вопросы