在SignalR.PersistentConnection.OnConnected事件期间,HttpSessionState不可用

时间:2013-05-28 16:43:13

标签: asp.net asp.net-mvc signalr

我使用SignalR将消息从ASP.NET MVC服务器推送到Web客户端。

我希望在接受来自客户端的新连接时存储当前客户端的连接ID,这样当我想将数据发送到此特定客户端时,我可以从会话中检索其连接ID并发送它消息。

但是,在OnConnected事件处理程序中,会话为空。因此,当我尝试将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 个答案:

答案 0 :(得分: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