首页 文章

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

提问于
浏览
5

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

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

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

Context.User.Identity.Name

My Hub

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
}

Start hub class(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();
        }
    }
}

4 回答

  • 6

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

    创建一个类 UserConnection

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

    声明一个列表

    List<UserConnection> uList=new List<UserConnection>();
    

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

    $.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();
    }
    

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

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

    DEMO

  • 25

    所有这些答案都不必要地复杂 . 我只是覆盖“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
        });
    
    });
    
  • 0

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

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

  • 0

    In ChatHub Class Use This for Spacific User

    public Task SendMessageToGroup(string groupName, string message)
        {
    
            return Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId}: {message}");
        }
    
        public async Task AddToGroup(string groupName)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
    
            await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
        }
    
        public async Task RemoveFromGroup(string groupName)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
    
            await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
        }
    

相关问题