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

问题描述 投票:0回答:3

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

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

gameHub.client.joyStickMethod()
没有用处。

就在这时我发现了一些奇怪的事情

事实证明,除非我定义了

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

这不起作用,因为集线器上没有客户端方法。我可能可以在 Hub 上添加一个

RegistrateJoystick
方法并调用它,但我认为这种行为是意外的。因此我的问题是:

有没有办法手动“连接”到集线器,这样

OnConnect
方法就会被调用?

javascript signalr signalr-hub signalr.client
3个回答
14
投票

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


1
投票

解决这个问题的方法是使用一个假集线器来连接。不执行任何操作,返回 void。至少这样,当您引导游戏时,在连接上调用 .start() 之前,您可以在假集线器上连接到此假方法。这将为您提供 onConnected() 方法。

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

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

--更新

我在我的项目中尝试过这个。我最初的想法是在客户端上创建服务器上不存在的集线器代理,但这失败了。但是,您可以只连接到“真实”集线器,但连接到一个假回调。这确实有效,并且可以让您轻松创建一个真正的方法。 这显然是一个可怕的解决办法,但在没有其他办法的情况下,它就完成了工作。


0
投票

connection = $.hubConnection("http://localhost:9002"); var proxy = connection.createHubProxy("testHub"); //without this on listener, OnConnected and OnDisconnected doesn't raise. proxy.on("messageToClients", (message) => { }); await connection.start(function () { console.log("Connected"); })

微软文档没有提及任何相关内容。

© www.soinside.com 2019 - 2024. All rights reserved.