简体   繁体   English

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

[英]Send message to specific user in signalr

I have a signalR Server(Console Application) and a client application(Asp.net MVC5) 我有一个signalR服务器(控制台应用程序)和一个客户端应用程序(Asp.net MVC5)

How I can send message to specific user in OAuth Membership. 如何在OAuth成员资格中向特定用户发送消息。

Actually I can't resolve sender user from hub request context with. 实际上我无法从中心请求上下文中解析发件人用户。

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) 启动集线器类(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();
        }
    }
}

Keep connectionId with userName by creating a class as we know that Signalr only have the information of connectionId of each connected peers. 通过创建一个类来保持connectionIduserName ,因为我们知道Signalr只有每个连接对等体的connectionId信息。

Create a class UserConnection 创建一个UserConnection

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

Declare a list 声明一个列表

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

pass user name as querystring during connecting from client side 在从客户端连接期间将用户名作为查询字符串传递

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

Push user with connection to this list on connected mthod 在连接的mthod上推送用户连接到此列表

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

From sending message search user name from list then retrive the user connectionid then send 从列表中发送消息搜索用户名,然后检索用户连接,然后发送

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

DEMO

All of these answers are unnecessarily complex. 所有这些答案都不必要地复杂。 I simply override "OnConnected()", grab the unique Context.ConnectionId, and then immediately broadcast it back to the client javascript for the client to store and send with subsequent calls to the hub server. 我只是覆盖“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);
    }
}

In the javascript: 在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
    });

});

In order to be able to get "Context.User.identity.Name", you supposed to integrate your authentication into OWIN pipeline. 为了能够获得“Context.User.identity.Name”,您应该将您的身份验证集成到OWIN管道中。

More info can be found in this SO answer: https://stackoverflow.com/a/52811043/861018 更多信息可以在这个SO答案中找到: https//stackoverflow.com/a/52811043/861018

In ChatHub Class Use This for Spacific User 在ChatHub类中将此用于太空用户

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM