2013-05-28 3 views
0

Я использую SignalR для передачи сообщений с сервера ASP.NET MVC на веб-клиентов.HttpSessionState не доступен во время события SignalR.PersistentConnection.OnConnected

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

Однако в обработчике событий OnConnected сеанс равен NULL. В результате мой код генерирует исключение ссылочной ссылки, когда я пытаюсь поместить connectionId в сеанс.

Код фрагмента кода.

using Microsoft.AspNet.SignalR; 

namespace TestSignalR 
{ 
    public class SignalRServerListener : PersistentConnection 
    { 
     protected override System.Threading.Tasks.Task OnConnected(
              IRequest request, 
              string connectionId) 
     { 
      System.Diagnostics.Debugger.Break(); 

      System.Diagnostics.Debug. 
      Print("Connection request received and accepted from 
      client with connection Id {0}", connectionId); 

      HttpContext.Current.Session["connectionId"] = connectionId; 

      return base.OnConnected(request, connectionId); 
     } 
    } 
} 

ответ

1

Вы можете отслеживать клиентов, как показано ниже

class MyConnections 
{ 
    private static List<String> _MyClients = new List<String>(); 

    public override Task OnConnected() 
    { 
     _MyClients.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     _MyClients.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 

    public static bool IsConnected(string cid) 
    { 
     return _MyClients.Contains(cid); 
    } 
} 

Теперь, когда сервер хочет послать данные в один из этих клиентов, как должен знать сервер, какое соединение Id следует использовать в Context.Connection.Send (connectionId, message)?

Context.DefaultSignal 
+0

спасибо. Ваш ответ и эта статья, которую я читал, ожидая ответа (http://www.syfuhs.net/post/2013/03/24/Real-time-User-Notification-and-Session-Management-with-SignalR -Part-2.aspx), похоже, говорят о том, что мы должны отслеживать сами идентификаторы соединения. Но если это список приложений (поскольку он является статическим), как я могу быть уверенным, что определенный идентификатор соединения принадлежит текущему HttpRequest/клиенту? –

+0

Текущий запрос обязательно будет снят в переопределении «OnConnected», и такое же соединение снова будет снято при отключении. – wwcdwdcw

+0

Я думаю, что мы не можем понять друг друга очень хорошо. Предположим, что у меня есть 3 клиента, подключенных к серверу. В этом случае ваш список будет иметь 3 идентификатора соединения. Теперь, когда сервер хочет отправить данные одному из этих клиентов, как сервер должен знать, какой идентификатор соединения должен использоваться в Context.Connection.Send ('connectionId', message)? –

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