使用SignalR 2

时间:2016-08-31 09:13:17

标签: android asp.net-mvc cordova signalr signalr-hub

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

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

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

取自官方的ASP.NET信号器示例,我有以下代码覆盖OnConnected事件。不幸的是,它不需要参数,并且期望User.Identity不为null:

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

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

但是怎么办呢?

1 个答案:

答案 0 :(得分:1)

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

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

向全球主持人注册您的提供商

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