javascript - net - SignalR: Hub OnConnected no llamado si no hay métodos de cliente
signalr test client (2)
Eso es por diseño. Si no tiene ninguna suscripción al concentrador, entonces ese cliente en particular no podrá recibir ningún mensaje del servidor al cliente. Aún puedes invocar métodos en el hub.
Estoy escribiendo un juego en SignalR. La idea es que se conecte con su computadora portátil, que se usará como "pantalla" y luego se conectará con su teléfono inteligente y que se usará como "joystick". Toda la configuración funciona muy bien.
Ahora que todo funciona, decidí refactorizar el código. Me di cuenta de que la relación entre el joystick y la pantalla es de una manera (la pantalla nunca necesita enviar información al joystick). Por lo tanto, decidí que no necesitaba ninguna de las funciones de invocación de cliente de signalR en el joystick (por ejemplo, no hay uso para gameHub.client.joyStickMethod()
en el joystick js.
Fue entonces cuando descubrí algo extraño.
Resulta que el método de hub public override Task OnConnected()
que public override Task OnConnected()
para tratar con los diferentes tipos de clientes (pantallas y joysticks) no se invoca a menos que defina un myHub.client.clientSideMethod()
. Aquí está el ejemplo con el que estoy tratando:
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
¿Ves ese método del lado del cliente vacío? Esa es la razón por la que OnConnected
se llama en el lado del servidor. Si elimino esa línea de código, no se llamará.
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
Esto no funcionará, ya que no hay un método del lado del cliente en el concentrador. Probablemente pueda agregar un método RegistrateJoystick
en el Hub y llamar a eso, pero creo que el comportamiento es inesperado. Mi pregunta es por lo tanto:
¿Hay alguna manera de "conectarse" manualmente al hub, de modo que se OnConnect
método OnConnect
?
Una forma de evitar esto es tener un concentrador falso al que te conectas. No hace nada, devuelve vacío. Al menos de esta manera, cuando inicia su juego, antes de llamar a .start () en la conexión, se conecta a este método falso en el centro falso. Esto te dará el método onConnected ().
Estoy de acuerdo, este es un comportamiento tan extraño. Si realiza una conexión, se debe activar onConnected (), incluso si no está escuchando eventos.
Lo que hace que esto sea aún más extraño es si está haciendo la autorización de Hub. Si deriva del AuthorizeAttribute, en su caso, se llamará a AuthorizeHubMethodInvokation () para cada método que invoque en el cliente, pero nunca se llamará a AuthorizeHubConnection ().
--Actualizar
Jugué un poco con esto en mi proyecto. Tuve la idea inicial de crear un proxy concentrador en el cliente que no existe en el servidor, pero esto falla. Sin embargo, solo puede conectarse a un concentrador real pero a una devolución de llamada falsa. Esto funciona y te permite crear un método real.
Esto es claramente un trabajo horrible, pero frente a nada más, hace el trabajo.