我在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
方法将被调用?
感谢您的回答。我理解你所说的逻辑,但与此同时,服务器端方法“OnConnect”的名称让我觉得,无论你的客户端是否具有可调用方法,它都会被调用。 – pardahlman
当然,但这不是它的工作原理。该方法是OnConnected。 – davidfowl
只是为了回应pardahlman在给出命名的时候说它有点不直观,可能值得在文档中明确地提出它以避免混淆。 –