2014-09-27 26 views
1

我从JavaScript的发送的用户ID,而我想提出请求signalr如下:SignalR IUserIdProvider不被调用用于用户标识和的ConnectionId映射

var userId = "1"; 
    var connection = $.hubConnection("/signalr", { useDefaultPath: false }); 
    var notificationsHubProxy = connection.createHubProxy('NotificationsHub'); 
    connection.qs = "userId=" + userId; 
    notificationsHubProxy.on('notify', function (notifications) { 
     notifyAll(notifications); 
    }); 
    connection.start() 
     .done(function() { 
      notificationsHubProxy.invoke('getNotifications', "1,2,3"); 
     }) 
     .fail(function(reason) { 
      alert('signalr error'); 
     }); 

下面是用于实施IUserIdProvider检索查询字符串并返回作为用户id类,我调试了,这个类和GetUserId方法没有被框架调用。

public class RealTimeNotificationsUserIdProvider : IUserIdProvider 
{ 
    public string GetUserId(IRequest request) 
    { 
     return request.QueryString["userId"]; 
    } 
} 

这是我与signalR配置挂钩IUserId提供商启动类:

 var userIdProvider = new RealTimeNotificationsUserIdProvider(); 
     GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => userIdProvider); 
     app.Map("/signalr", map => 
     { 
      var hubConfiguration = new HubConfiguration 
      {    
       EnableDetailedErrors = true, 
       Resolver = dependencyResolver, 
       EnableJavaScriptProxies = false 
      }; 
      map.RunSignalR(hubConfiguration); 
     }); 

现在,当我尝试通过访问Clients.User(用户ID)发送通知给特定用户的不工作:

 var userId = "1"; 
     Clients.User(userId).notify("test"); 

我在想什么?请帮忙。

回答

0

你看起来应该有效。唯一看起来很可疑的是,你正在注册你的IUserIdProviderGlobalHost.DependencyResolver,但你的HubConfiguration中有Resolver = dependencyResolver

在你的问题的其他地方没有其他的参考dependencyResolver。如果您要忽略Resolver = dependencyResolver,则SignalR默认使用GlobalHost.DependencyResolver

0

hier是我做了什么来解决这个问题,形式我request.QueryString [“userId”]没有返回用户ID,这就是为什么它没有工作,我改变你的代码,像下面,它确实工作我测试t在我的项目:

using using System.Web; 

    public class RealTimeNotificationsUserIdProvider : IUserIdProvider 
    { 
    public string GetUserId(IRequest request) 
    { 
     return HttpContext.Current.User.Identity.GetUserId() 
    } 
} 
  • 删除变种userIdProvider =新RealTimeNotificationsUserIdProvider(),并把它写象下面这样:

    ConfigureAuth(app); 
    GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new RealTimeNotificationsUserIdProvider()); 
         app.Map("/signalr", map => 
         { 
          var hubConfiguration = new HubConfiguration 
         {    
         EnableDetailedErrors = true,     
         EnableJavaScriptProxies = false 
         }; 
          map.RunSignalR(hubConfiguration); 
         });