2013-01-11 69 views
16

我在SignalR中编写游戏。这个想法是,你连接你的笔记本电脑,这将被用作“显示器”,然后你连接你的智能手机,这将被用作“游戏杆”。整个设置工作得很好。SignalR:Hub OnConnected如果没有客户端方法,则不会调用

现在,它的一切工作,我决定重构代码。我意识到操纵杆和显示器之间的关系是一种方式(显示器从不需要将信息发送回操纵杆)。因此,我决定,我并不需要在操纵杆上的任何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上没有客户端方法。我可以在Hub上添加一个RegistrateJoystick方法并调用它,但我认为这种行为是意外的。我的问题是因此:

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

回答

14

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

+6

感谢您的回答。我理解你所说的逻辑,但与此同时,服务器端方法“OnConnect”的名称让我觉得,无论你的客户端是否具有可调用方法,它都会被调用。 – pardahlman

+1

当然,但这不是它的工作原理。该方法是OnConnected。 – davidfowl

+1

只是为了回应pardahlman在给出命名的时候说它有点不直观,可能值得在文档中明确地提出它以避免混淆。 –

1

解决这个问题的一个方法就是建立一个假的集线器。什么都不做,返回无效。至少在这种情况下,当你引导你的游戏时,在连接上调用.start()之前,你在假集线器上连接到这个假方法。这将为您带来onConnected()方法。

我同意,这是很奇怪的行为。如果你建立连接,即使你没有收听事件,onConnected()也应该被提出。

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

- 更新

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

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

相关问题