我有一个问题,如何从Application控制器获取userId?我看到很多样本,如何从Hubs获得它。但我不知道如何以其他方式从控制器调用集线器
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
在上下文中我没有任何id。
我看到这样的样本,在这里我可以调用上下文并获取UserId,但这只适用于Hub。
var name = context.User.Identity.Name;
我知道我可以做那样的事情:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
但我必须从控制器呼叫集线器。
感谢您的帮助
答案 0 :(得分:3)
我可以建议采用略有不同的方法。一般而言,从信号器环境外部进入集线器并不能很好地工作或至少使事情变得更复杂。
您可以让控制器充当集线器本身的客户端,并通过集线器将您需要的信息暴露给控制器。您所需要的只是SignalR Desktop Client package。虽然它增加了开销,但您可以采用更加合规的方式进行数据检索,并且可以很好地分离关注点。
这是我回复的similar question。 HTH。
答案 1 :(得分:1)
如果你的应用程序中有某种身份验证,一个好主意可能是在用户和连接之间保持映射。
这样,只要您想向用户发送消息,只需检索该用户的所有连接ID并将消息发送给所有用户。
foreach(var connectionId in UserMapping)
context.Clints.Client(connectionId).sendMessage(message);
这样,您就可以从集线器外部向特定客户端发送消息,并确保客户端的所有实例都得到通知。
看看here for more information on Mapping SignalR Users to Connections.
希望这有帮助。
祝你好运!
答案 2 :(得分:0)
我找到了解决方案。
顺便说一句,谢谢你的答案。
我尝试使用应用程序控制器调用的类中的signalR。 在课堂上我没有任何关于呼叫服务器的用户的上下文和特殊数据。
但我在控制器信息中找到了关于调用服务器的用户的信息。
this.User.Identity.Name
快乐的编码;)