SignalR:使用GlobalHost.ConnectionManager发送数据不起作用

时间:2013-11-22 07:12:19

标签: c# signalr

我有一个像这样的中心:

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获取的'clients'对象向客户端发送消息时遇到麻烦,因此我将这个问题提炼出去以显示什么不起作用。

我见过很多帖子,人们遇到的问题包括在启动集线器之前没有使用客户端注册js处理程序或者没有引入正确的js依赖项,但这些似乎不是我的问题。我有什么理由不能使用GlobalHost.ConnectionManager.GetHubContext()向客户端发送消息。客户端?

修改 为了回应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 );
        }

    }

1 个答案:

答案 0 :(得分:29)

使用自定义依赖项解析程序时,仅将其传递给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<MessageHubBub>()