目前我已经学会了如何从服务器端通知集线器。然后,集线器将通知广播给客户端。
我正在处理的上下文是基于发送朋友请求(类似于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);
}
}
}
对于我想做的事情,可能还有其他一些解决方法吗? (即让每个人都有自己的通知?)
答案 0 :(得分:4)
您对该中心的js引用应为$.connection.notificationHub
而不是$.connection.hub
。它取自您的集线器的类名。如果您愿意,可以使用[HubName(“name”)]属性重命名它。
此外,SignalR将管理您的Hub的生命周期。您不需要创建实例。我会仔细检查来源,看它是否是每次通话或单身等等。
关于(如果我正确阅读)以任何方式使用朋友的连接ID - 这不是一个好主意。目前,它们不是安全的,这将允许用户很容易伪装成任何其他用户。
编辑:再一次提示 - 在集线器中,您不必使用ConnectionManager来获取客户端。您只需使用Clients属性即可。 IE,客户端[gid.ToString()]。newNotification(value);