使用 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
我正在尝试为 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