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

par*_*man 17 javascript signalr signalr-hub signalr.client

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

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

就在那时我发现了一些奇怪的东西

事实证明,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
Run Code Online (Sandbox Code Playgroud)

你看到那个空的客户端方法?这就是为什么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
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*owl 14

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

  • 谢谢你的回答.我理解你所说的逻辑,但与此同时,服务器端方法"OnConnect"的名称告诉我,无论你的客户端是否具有可调用的方法,它都会被调用. (6认同)