SignalR:集线器OnConnected不叫,如果没有客户端的方法(SignalR: Hub O

2019-08-06 10:04发布

我写在SignalR游戏。 这个想法是,你与你的笔记本电脑,这将作为“显示”连接,然后你与你的智能手机连接,并且将作为“操纵杆”。 整个安装工作​​得很好。

现在,所有的工作,我决定重构代码。 我意识到,操纵杆和显示器之间的关系是单向的(显示永不需要将信息发送回操纵杆)。 因此,我决定,我并不需要在操纵杆上的任何signalR可调用客户端功能(例如没有使用了gameHub.client.joyStickMethod()操纵杆JS。

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

事实证明,集线器方法public override Task OnConnected()我覆盖要处理的不同类型的客户端(显示器和操纵杆)的没有被调用,除非我限定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

这是行不通的,因为是在集线器没有客户端的方法。 我也许可以添加一个RegistrateJoystick在集线器方法和调用,但我认为该行为是意外。 因此,我的问题是:

有没有办法手动“连接”到集线器,这样OnConnect方法将被调用?

Answer 1:

这是由设计。 如果你没有任何订阅到集线器则该特定客户端不能不会得到任何消息,从服务器到客户端。 您仍然可以调用在轮毂上的方法。



Answer 2:

解决的办法是只具有连线到一个假的枢纽。 不执行任何操作,返回void。 至少这样,当你引导你的游戏,你可以调用。开始()在连接之前,您线了对假枢纽这个假方法。 这将让你的onConnected()方法。

我同意,这是这样奇怪的行为。 如果你犯了一个连接,onConnected()应适当提高,即使你不听的事件。

是什么让这个更奇怪的是,如果你正在做的枢纽授权。 如果从AuthorizeAttribute派生,在你的情况下,AuthorizeHubMethodInvokation()将被调用为每个客户端上的调用方法,但AuthorizeHubConnection()将永远不会被调用。

--update

我打得四处这对我的项目。 我不得不创建不存在于服务器上的客户端上的枢纽代理的iniital想法,但这个失败。 但是,你可以钩到一个真正的枢纽,但假的回调。 这并不工作,并让你得逞创造一个真正的方法。

这显然是一个可怕的解决办法,但在没有别的脸,做这项工作。



文章来源: SignalR: Hub OnConnected not called if no client methods