2014-09-27 30 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); 
         });