在signalr中向特定用户发送消息

我有一个signalR服务器(控制台应用程序)和一个客户端应用程序(Asp.net MVC5)

如何在OAuth成员资格中向特定用户发送消息。

实际上我无法从中心请求上下文中解析发件人用户。

Context.User.Identity.Name 

我的中心

 public class UserHub : Hub { #region Hub Methods public void LoggedIn(string userName, string uniqueId, string ip) { Clients.All.userLoggedIn(userName, uniqueId, ip); } public void LoggedOut(string userName, string uniqueId, string ip) { var t = ClaimsPrincipal.Current.Identity.Name; Clients.All.userLoggedOut(userName, uniqueId, ip); } public void SendMessage(string sendFromId, string userId, string sendFromName, string userName, string message) { Clients.User(userName).sendMessage(sendFromId, userId, sendFromName, userName, message); } #endregion } 

启动集线器类(Program.cs)

 class Program { static void Main(string[] args) { string url = string.Format("http://localhost:{0}", ConfigurationManager.AppSettings["SignalRServerPort"]); using (WebApp.Start(url)) { Console.WriteLine("Server running on {0}", url); Console.ReadLine(); } } } 

通过创建类来保持connectionIduserName ,因为我们知道Signalr只有每个连接对等体的connectionId信息。

创建一个UserConnection

 Class UserConnection{ public string UserName {set;get;} public string ConnectionID {set;get;} } 

声明一个列表

 List uList=new List(); 

在从客户端连接期间将用户名作为查询字符串传递

 $.connection.hub.qs = { 'username' : 'anik' }; 

在连接的mthod上推送用户连接到此列表

 public override Task OnConnected() { var us=new UserConnection(); us.UserName = Context.QueryString['username']; us.ConnectionID =Context.ConnectionId; uList.Add(us); return base.OnConnected(); } 

从列表中发送消息搜索用户名,然后检索用户connectionid然后发送

 var user = uList.Where(o=>o.UserName ==userName); if(user.Any()){ Clients.Client(user.First().ConnectionID ).sendMessage(sendFromId, userId, sendFromName, userName, message); } 

DEMO

所有这些答案都不必要地复杂。 我只是覆盖“OnConnected()”,获取唯一的Context.ConnectionId,然后立即将其广播回客户端javascript,以便客户端存储和发送以及后续调用中心服务器。

 public class MyHub : Hub { public override Task OnConnected() { signalConnectionId(this.Context.ConnectionId); return base.OnConnected(); } private void signalConnectionId(string signalConnectionId) { Clients.Client(signalConnectionId).signalConnectionId(signalConnectionId); } } 

在javascript中:

 $(document).ready(function () { // Reference the auto-generated proxy for the SignalR hub. var myHub = $.connection.myHub; // The callback function returning the connection id from the hub myHub.client.signalConnectionId = function (data) { signalConnectionId = data; } // Start the connection. $.connection.hub.start().done(function () { // load event definitions here for sending to the hub }); }); 

为了能够获得“Context.User.identity.Name”,您应该将您的身份validation集成到OWIN管道中。

更多信息可以在这个SO答案中找到: https : //stackoverflow.com/a/52811043/861018