如何使用signalR向特定用户发送消息

我有一些signalR的问题,我无法向特定的User From Hub发送消息。

我想这样做:

public void Send(string userToId, string userForId, string message) { IHubContext context = GlobalHost.ConnectionManager.GetHubContext(); //userForId - it is Session["UserId"] context.Clients.User(userForId).updateMessages(message); } 

我已经阅读过这个主题: http : //www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections ,但我不清楚,因为我没有这个var name = Context.User.Identity.Name; 我在Session变量中有用户信息,第二个是当我得到connectionId时这样: var myClientId = $.connection.hub.id; 我刷新页面或单击项目上的另一个菜单时,connectionId已更改。

我有一些问题:1)我可以在没有connectionId的情况下向特定用户发送消息(仅使用session [“UserId”])吗? 2)总的来说,如何使用SignalR轻松实现一对一的消息传递?

PS我正在使用ASP.NET MVC(C#)

您可以向没有连接ID的所有用户发送广播消息。 您只需要为每个用户分配一个唯一ID,并将其作为消息参数发送。

SignalR为每个客户端提供唯一ID作为连接ID。 您可以使用该连接ID,也可以在创建客户端时为客户端分配唯一ID,并将其用作连接ID。 这取决于你想要使用什么。

编辑

只需在Hub类文件中更新您的方法…..

  public void Send(string name, string message, string connectionid) { // Call the addNewMessageToPage method to update clients. Clients.All.addNewMessageToPage(name, message, connectionid); } 

在您的客户端,您可以在包含SignalR文件后更新添加代码: –

  var chat = $.connection.chatHub; chat.client.addNewMessageToPage = function (name, message, connectionid) { if (connectionid == $('#connection').val()) { // Do What You want Here... }; }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); $('#connection').val(prompt('Enter your ID:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val(), $('#connection').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); 

希望这可以帮助…

如果要在SignalR中向特定用户发送消息,最简单的方法是使用表单身份validation。 您还可以使用自定义会话进行表单身份validation。 创建后,您的会话代码就会生成此代码。

 FormsAuthentication.SetAuthCookie(username.Trim(), false); 

然后在signalR中,您可以使用此行向此用户发送消息:

 var username = Context.User.Identity.Name; context.Clients.User(username).updateMessages(message); 

编辑:

对于您的问题,将用户名传递给此方法(接收者用户名)并将消息推送给该用户。然后您不需要提供userForId,因为您已经拥有发件人用户名“var username = Context.User.Identity.Name;”。这个方法只会推送到接收者用户名的方法。 如果你想获得发送者的消息,你需要使用“来电者”,你需要一个写新的function来获取javascript中的来电信息。我希望它对你有用。

 public void Send(string username, string message) { context.Clients.Caller.updateMessagesCaller(message); context.Clients.User(username).updateMessages(message); } 

此消息将只发送该用户名。我的建议是在整个项目中使用FormAuthentication实现。谢谢。