hubcontext是null signalr

时间:2012-04-02 16:42:39

标签: asp.net notifications signalr

目前我已经学会了如何从服务器端通知集线器。然后,集线器将通知广播给客户端。

我正在处理的上下文是基于发送朋友请求(类似于Facebook)。 如果X先生向Y女士发出请求,那么只有Y女士会弹出通知。

因此我决定与团队合作。我在想一个小组 - 一个用户。

问题是我在集线器启动时尝试过这样做:

$。connection.hub.start(function(){hub.login(XXX);});

其中XXX将是会话中的用户名或用户ID。我不知道该怎么做。

然后,我尝试使用用户名或用户ID创建隐藏标签,将其填入page_load,然后从客户端获取。但客户端在服务器端之前工作。

然后我尝试使用集线器上下文的连接ID。但问题似乎是几乎所有内容,例如上下文和组管理器在集线器中都是空的。是因为我正在使用集线器的实例吗?还是因为我有静态方法? (我需要静态/或者有一个实例,因为我从其他服务器端代码调用这些方法)

     using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SignalR.Hubs;
using SignalR;
using SignalR.Hosting.AspNet;
using System.Web;
using System.Web.SessionState;

namespace DataLayer
{
    public class NotificationHub: Hub
    {
        private static NotificationHub instance;

        private NotificationHub() { }

        public static NotificationHub Instance
        {
            get
            {
                if (instance == null)
                    instance = new NotificationHub();
                return instance;
            }
        }

        public void NotifyClients(int gid, string value)
        {
            IConnectionManager connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager));
            dynamic clients = connectionManager.GetClients<NotificationHub>();
            clients[gid.ToString()].newNotification(value);
            //let us then try to use connection id, but this.Context.ConnectionId is null

        }

        public void Login(string gid)
        {
            AddToGroup(gid);
        }

    }
}

对于我想做的事情,可能还有其他一些解决方法吗? (即让每个人都有自己的通知?)

1 个答案:

答案 0 :(得分:4)

您对该中心的js引用应为$.connection.notificationHub而不是$.connection.hub。它取自您的集线器的类名。如果您愿意,可以使用[HubName(“name”)]属性重命名它。

此外,SignalR将管理您的Hub的生命周期。您不需要创建实例。我会仔细检查来源,看它是否是每次通话或单身等等。

关于(如果我正确阅读)以任何方式使用朋友的连接ID - 这不是一个好主意。目前,它们不是安全的,这将允许用户很容易伪装成任何其他用户。

编辑:再一次提示 - 在集线器中,您不必使用ConnectionManager来获取客户端。您只需使用Clients属性即可。 IE,客户端[gid.ToString()]。newNotification(value);