SignalR:如果没有客户端方法,则不调用Hub OnConnected

时间:2013-01-11 07:58:24

标签: javascript signalr signalr-hub signalr.client

我在SignalR写一个游戏。这个想法是你用你的笔记本电脑连接,它将用作“显示器”,然后你连接智能手机,它将被用作“操纵杆”。整个设置非常有效。

现在一切正常,我决定重构代码。我意识到操纵杆和显示器之间的关系是一种方式(显示器永远不需要将信息发送回操纵杆)。因此我决定在操纵杆上不需要任何signalR可调用的客户端函数(例如,操纵杆js中没有gameHub.client.joyStickMethod()

然后我发现了一些奇怪的东西

事实证明,除非我定义public override Task OnConnected(),否则不会调用我覆盖以处理不同类型的客户端(显示和操纵杆)的hub方法myHub.client.clientSideMethod()。这是我正在处理的例子:

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub
        });

        gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

你看到那个空的客户端方法?这就是为什么在服务器端调用OnConnected的原因。如果删除该行代码,则不会调用它。

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub 
        });

        //gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

这不起作用,因为Hub上没有客户端方法。我可以在Hub上添加RegistrateJoystick方法并调用它,但我认为这种行为是出乎意料的。因此,我的问题是:

有没有办法手动“连接”到集线器,以便调用OnConnect方法?

2 个答案:

答案 0 :(得分:14)

这是设计的。如果您没有对集线器的任何订阅,那么该特定客户端将无法从服务器到客户端获取任何消息。您仍然可以在集线器上调用方法。

答案 1 :(得分:1)

解决这个问题的方法就是让你有一个假的Hub。什么都不做,返回无效。至少这种方式,当您在连接上调用.start()之前引导游戏时,您会在虚拟集线器上连接到这种假方法。这将为您提供onConnected()方法。

我同意,这是一种奇怪的行为。如果建立连接,即使您没有收听事件,也应该引发onConnected()。

如果您正在进行Hub授权,那么更奇怪的是什么。如果从AuthorizeAttribute派生,在您的情况下,将为您在客户端上调用的每个方法调用AuthorizeHubMethodInvokation(),但永远不会调用AuthorizeHubConnection()。

- 更新

我在我的项目中玩弄了这个。我有一个在服务器上不存在的客户端上创建集线器代理的想法,但这失败了。但是,您可以连接到真正的集线器,但这是一个虚假的回调。这确实有效,让您可以创建一个真正的方法。

这显然是一项可怕的工作,但面对其他任何事情,无论如何工作。