Hola!
Y seguimos con SignalR, en este caso para denunciar a clientes HTML que no entran en el evento OnConnected() del Hub. Hace varios meses que escribí un post donde explicaba una opción para poder definir diferentes canales o grupos de mensajes dentro de un mismo hub.
La base de este patrón es una vez iniciada la sesion, invocar a una funcíón en el server que separa lso grupos en una colección particular. Es en este punto donde el evento OnConnected() toma relevancia porque es un momento muy bueno para poder tener una primera identificación de un cliente conectado al Hub.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public override System.Threading.Tasks.Task OnConnected() | |
| { | |
| // some weird stuff here | |
| return base.OnConnected(); | |
| } | |
| public void JoinToArea(string area) | |
| { | |
| Groups.Add(Context.ConnectionId, area); | |
| } |
Ahora bien, veamos un ejemplo simple de un cliente HTML que se conecta a un hub y cuando la función start() del hub ha terminado invoca la función JoinToArea
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <script type="text/javascript"> | |
| var hub; | |
| $(window).ready(function () { | |
| console.log("windows ready para SignalR"); | |
| hub = $.connection.SampleHub; | |
| $.connection.hub.start().done( | |
| function () { | |
| var area = 'default'; | |
| console.log("hub started, area:" + area); | |
| hub.server.JoinToArea(area); | |
| }); | |
| }); | |
| </script> |
A primera vista el código está bien, si activas las trazas, la llamada a JoinToArea() en el hub se realiza correctamente. El problema está en que no se lanza el OnConnected() del hub, ya que no hay ningún requerimiento contra el cliente del hub.
La forma de forzar la llamada al OnConnected es invocar una función dummy del cliente del hub antes de llamar al JoinToArea(). El ejemplo anterior se completa con la línea 7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <script type="text/javascript"> | |
| var hub; | |
| $(window).ready(function () { | |
| console.log("windows ready para SignalR"); | |
| hub = $.connection.SampleHub; | |
| // dummy call to force the [OnConnected()] method on signalR hub | |
| hub.client.foo = function () { }; | |
| $.connection.hub.start().done( | |
| function () { | |
| var area = 'default'; | |
| console.log("hub started, area:" + area); | |
| hub.server.JoinToArea(area); | |
| }); | |
| }); | |
| </script> |
Fácil ![]()
Saludos @ Home
El Bruno
Leave a comment