【问题标题】:SignalR IUserIdProvider not invoked for userid and connectionid mapping未为 userid 和 connectionid 映射调用 SignalR IUserIdProvider
【发布时间】:2014-09-27 08:12:13
【问题描述】:

当我向信号器发出请求时,我正在从 javascript 发送用户 ID,如下所示:

 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 的类,该类检索查询字符串并返回为 userId,我已调试,框架未调用此类和 GetUserId 方法。

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

这是我的启动类,用于将 IUserId 提供程序与 signalR 配置挂钩:

      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(userId) 向特定用户发送通知时,它不起作用:

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

我错过了什么?请帮忙。

【问题讨论】:

    标签: javascript c# asp.net signalr signalr-hub


    【解决方案1】:

    你所拥有的看起来应该可以工作。唯一看起来可疑的是,您正在使用 GlobalHost.DependencyResolver 注册您的 IUserIdProvider,但是您的 HubConfiguration 中有 Resolver = dependencyResolver

    在您的问题的其他任何地方都没有对dependencyResolver 的其他引用。如果您要省略 Resolver = dependencyResolver,SignalR 将默认使用 GlobalHost.DependencyResolver

    【讨论】:

      【解决方案2】:

      hier 是我为解决这个问题所做的,从我的请求中请求.QueryString["userId"] 没有返回用户 ID,这就是它不起作用的原因,我像下面这样更改了你的代码,它确实有效,我测试过我的项目:

         using using System.Web;
      
        public class RealTimeNotificationsUserIdProvider : IUserIdProvider
        {
         public string GetUserId(IRequest request)
         {
            return HttpContext.Current.User.Identity.GetUserId()
         }
       }
      
      • 删除 var userIdProvider = new 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);
               });
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 2019-09-08
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        相关资源
        最近更新 更多