17

我正在 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调用该方法?

4

2 回答 2

14

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

于 2013-01-11T16:34:11.617 回答
1

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

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

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

- 更新

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

这显然是一个可怕的工作,但面对没有别的,做这项工作。

于 2015-10-14T14:14:56.033 回答