我正在尝试为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();
}
现在,也许我需要的是拥有一个将字符串作为参数的方法版本,然后我将其用作我的用户标识符。
但是怎么办呢?
答案 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