2016-08-31 45 views
3

我正在尝试为Phonegap/Cordova应用程序创建实时通信功能。我使用SignalR 2来处理通信。使用SignalR 2在Phonegap/Cordova应用程序中发送消息特定用户

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

从本质上讲,我不认证传统意义上的用户,所以我需要另一种方法将SignalR connectionID与用户名相关联。

取自官方的ASP.NET信号器例子,我有下面的代码覆盖了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(); 
    } 

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

但如何去做呢?

+0

好感谢upvotes反正。 –

回答

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

相关问题