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

Mah*_*eni 7 c# asp.net signalr signalr-hub

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

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

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

Context.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

我的中心

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
}
Run Code Online (Sandbox Code Playgroud)

启动集线器类(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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ani*_*bhi 26

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

创建一个类 UserConnection

Class UserConnection{
  public string UserName {set;get;}
  public string ConnectionID {set;get;}
}
Run Code Online (Sandbox Code Playgroud)

声明一个列表

List<UserConnection> uList=new List<UserConnection>();
Run Code Online (Sandbox Code Playgroud)

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

$.connection.hub.qs = { 'username' : 'anik' };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

DEMO

  • 这可以通过实现自定义的`IUserIdProvider`实现以一种非常简单的方式完成,您可以在其中处理查询字符串,然后使用`Clients.User`方法.无需保留任何单独的连接ID列表. (2认同)

Bob*_*inn 6

所有这些答案都不必要地复杂.我只是覆盖"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
    });

});
Run Code Online (Sandbox Code Playgroud)