使用 SignalR 2 在 Phonegap/Cordova 应用程序中向特定用户发送消息

Message specific user in a Phonegap/Cordova app using SignalR 2

我正在尝试为 Phonegap/Cordova 应用程序创建实时通信功能。我正在使用 SignalR 2 来处理通信。

我正在努力解决的问题是向特定用户发送消息。那里的每个示例都显示保存 Context.User.Identity.Name,这对我来说没用,因为我的 phonegap 应用程序不共享远程站点的 User.Identity 上下文。

本质上,我不是在传统意义上对用户进行身份验证,因此我需要另一种方法将 SignalR connectionID 与我传递的用户名相关联。

摘自官方 ASP.NET signalr 示例,我有以下代码覆盖了 OnConnected 事件。不幸的是,它没有参数并且期望 User.Identity 不为空:

public override Task OnConnected()
    {
        using (var db = new UserContext())
        {
            // Retrieve user.
            var user = db.Users
                .Include(u => u.Rooms)
                .SingleOrDefault(u => u.UserName == Context.User.Identity.Name);

            // If user does not exist in database, must add.
            if (user == null)
            {
                user = new User()
                {
                    UserName = Context.User.Identity.Name
                };
                db.Users.Add(user);
                db.SaveChanges();
            }
            else
            {
                // Add to each assigned group.
                foreach (var item in user.Rooms)
                {
                    Groups.Add(Context.ConnectionId, item.RoomName);
                }
            }
        }
        return base.OnConnected();
    }

现在,也许我需要的是使用此方法的一个版本,将字符串作为参数,然后将其用作我的用户标识符。

但是怎么办呢?

您需要为用户创建一个新的 IUserIdProvider 并使用依赖注入来注册您的提供者并使用它。

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}

向 Global Host 注册您的提供商

GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new MyIdProvider());

用法:

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

取自:http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#IUserIdProvider