我想将signalR用于我的clint浏览器网站,以便在添加新订单时可以从服务器接收消息。所以我希望它对未被任何浏览器触发的服务器端事件做出反应。
网站上有多个用户。当他在服务器上为他订购新订单时,应通知用户。我如何仅通知特定用户,并通过添加用户的方法执行此操作?
是否有任何代码:
var chat=new Chat();
chat.Send("hihi");
放在AddOrder方法中,带
public class Chat : Hub
{
public void Send(string message)
{
// Call the addMessage method on all clients
Clients.refresh(message);
}
}
答案 0 :(得分:1)
您可以覆盖默认客户端ID(用于标识用户浏览器窗口)并替换为您自己的ID。您的客户ID将来自您的会员提供商。
创建一个新类并实现IConnectionIdGenerator。
public class UserIdClientIdFactory : IConnectionIdGenerator
{
public string GenerateConnectionId(IRequest request)
{
return Guid.NewGuid().ToString();
}
}
上述方法只会创建一个新的Guid,但您会从会员提供商处返回客户ID。
然后,您需要使用SignalR依赖性解析器注册此新类,因此在global.asax文件的Application_Start方法中添加以下行
GlobalHost.DependencyResolver.Register(typeof运算(IConnectionIdGenerator), ()=> new UserIdClientIdFactory());
当下新订单时,您将获得特定客户并向其广播消息,例如:
//clientId matches the user id from you membership provider.
var clients = GlobalHost.ConnectionManager.GetHubContext().Clients;
clients[clientId].yourClientSideCallBackMethodGoesHere(someValue);
我做了一个关于类似事情的简短博客,可能对你有帮助。 Adding real time statistics
答案 1 :(得分:0)
您必须为所有已关联的用户存储Context.ConnectionId
,将其与您的网站用户绑定,然后使用Clients[connectionId].addMessage(data);
答案 2 :(得分:0)
您可以执行此操作的一种方法是保存每个与连接ID配对的用户(网站用户)集合。然后,您可以使用SignalConne事件OnConnected / OnDisconnected将用户弹出和导出此列表。
E.g。
public override Task OnConnected()
{
// Add users here with Context.ConnectionId
}
public override Task OnDisconnected()
{
// Remove users from collection here by identifying them with Context.ConnectionId
}