【问题标题】:SignalR: Sending data using GlobalHost.ConnectionManager not workingSignalR:使用 GlobalHost.ConnectionManager 发送数据不起作用
【发布时间】:2013-11-22 07:12:19
【问题描述】:

我有一个这样的集线器:

public class MessageHubBub : Hub
{

    public void ServerMethod()
    {
        Clients.All.sayHi("hello");
        GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>().Clients.All.sayHi( "Hello" );
    }
}

我的(相关的)javascript 看起来像这样:

 $.connection.MessageHubBub.client.sayHi = function (message) {
                console.log("Hello");
            };

            $.connection.hub.start().done(function () {
                $.connection.MessageHubBub.server.ServerMethod();
            });

真正奇怪的是“Hello”只被打印了一次,而我原以为它会被打印两次(因为“sayHello”被调用了两次)。一般来说,我在使用从 GlobalHost.ConnectionMananager 获得的“客户端”对象向客户端发送消息时遇到了麻烦,所以我将这个问题提炼出来以说明什么不起作用。

我看过很多帖子,其中有人遇到问题,例如在启动集线器之前没有向客户端注册他们的 js 处理程序或没有引入正确的 js 依赖项,但这些似乎不是我的问题。有什么原因我无法使用 GlobalHost.ConnectionManager.GetHubContext().Clients 向客户端发送消息?

编辑: 作为对 Lars 的回应,我确实有一个自定义依赖解析器,以便我可以将 Unity 集成到 SignalR 中。我按照我在这里找到的一个例子:http://www.kevgriffin.com/using-unity-for-dependency-injection-with-signalr/

我仅有的一行配置如下:

RouteTable.Routes.MapHubs( new HubConfiguration() { Resolver = new SignalRUnityDependencyResolver( unityContainer ) } );

SignalRUnityDependencyResolver 如下所示:

public class SignalRUnityDependencyResolver : DefaultDependencyResolver
    {
        private IUnityContainer _container;

        public SignalRUnityDependencyResolver( IUnityContainer container )
        {
            _container = container;
        }

        public override object GetService( Type serviceType )
        {
            if ( _container.IsRegistered( serviceType ) ) return _container.Resolve( serviceType );
            else return base.GetService( serviceType );
        }

        public override IEnumerable<object> GetServices( Type serviceType )
        {
            if ( _container.IsRegistered( serviceType ) ) return _container.ResolveAll( serviceType );
            else return base.GetServices( serviceType );
        }

    }

【问题讨论】:

标签: c# signalr


【解决方案1】:

使用自定义依赖解析器时,仅将其传递给 HubConfiguration 是不够的。

您需要将解析器实例存储在某处并像这样使用它来访问连接管理器和您的集线器上下文:

MyDependencyResolver.Resolve<IConnectionManager>().GetHubContext<MyHub>();

或将 GlobalHost 中的默认依赖解析器设置为您的实例:

var myResolver = new SignalRUnityDependencyResolver(unityContainer);
RouteTable.Routes.MapHubs( new HubConfiguration() { Resolver = myResolver } );
GlobalHost.DependencyResolver = myResolver;

(那么你可以使用默认的GlobalHost.ConnectionManager.GetHubContext&lt;MessageHubBub&gt;()

【讨论】:

  • 你是救生员!
  • 我花了很长时间才找到。您的解决方案完美运行。谢谢。
  • 是的,使用SignalRUnityDependencyResolver 的相同实例很重要。特别是如果您在构造函数中创建子容器。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多