Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
miércoles, 25 de junio de 2014
SignalRHace pocos días se ha publicado la revisión 2.1 de SignalR que, aparte de corregir bugs, introduce algunas funcionalidades que pueden resultar interesantes en muchos escenarios. En cualquier caso, como se podría esperar de una revisión de este calado, no rompen con nada existente ni resultan cambios espectaculares, simplemente aportan algunas características que no fueron incluidas en la versión 2.0 por falta de tiempo, o que han surgido con posterioridad.

En esta serie de posts  recorreremos las características más interesantes incluidas en esta revisión, y comenzaremos tratando la nueva capacidad de hacer llamadas al lado cliente desde los Hubs utilizando tipado fuerte.

1. Situación actual

Como sabéis (y los que no, ya estáis tardando ;-)), cuando desde un Hub en el servidor queremos invocar a un método de todos los clientes conectados al mismo, simplemente tenemos que ejecutar un método sobre la propiedad Clients.All. Por ejemplo, en el siguiente código estaríamos invocando el método message  del lado cliente, suministrándole dos parámetros:
public class EchoHub : Hub
{
    public Task BroadcastMessage(string senderName, string message)       
    {
        return Clients.All.Message(senderName, message);

    }
}
Esto es fantástico, y forma parte de la magia de SignalR: Clients.All, al igual que otros selectores de destinatarios del mensaje como Clients.Client o Clients.Others, son sólo propiedades de tipo dinámico,  y por esta razón podemos usarlas para invocar sobre ellas métodos con cualquier nombre y parámetros.

Como consecuencia, en tiempo de compilación no hay ningún tipo de comprobación sobre el nombre del método invocado, ni el número de parámetros que le estamos suministrando, ni siquiera su tipo. Es decir, el código compilará perfectamente tanto si hacemos la llamada correcta Clients.All.Message(senderName, message) como si nos equivocamos en uno o varios aspectos al introducirla (por ejemplo, si usamos Clients.All.Mesage(senderName, 1, message)).

Y obviamente, tampoco tendremos ayudas del editor como intellisense o autocompletado.

2. Hubs tipados en Signalr 2.1

En esta revisión de SignalR, a la hora de crear un hub podemos indicar un interfaz que define las operaciones que se encuentran disponibles a nivel cliente. Para ello, en lugar de heredar como siempre desde la clase Hub, heredaremos de Hub<T>, siendo T el tipo del interfaz con la definición del contrato. El código anterior quedaría como sigue:
public class EchoHub : Hub<IEchoClient>
{
    public Task BroadcastMessage(string senderName, string message)       
    {
        return Clients.All.Message(senderName, message);
    }
}

public interface IEchoClient
{
    Task Message(string senderName, string message);
}
A partir de ese momento, todos los selectores de destinatarios como Clients.All o Clients.Others serán considerados del tipo T , por lo que sólo podremos realizar sobre ellos llamadas definidas por el interfaz y, por supuesto, tendremos de nuevo disponibles todas las ventajas a nivel de editor:

Llamadas a métodos de cliente con tipo

En fin, que sin ser espectacular, sí es una ayuda interesante para el desarrollador cuando estamos trabajando en hubs  con gran número de métodos en cliente, donde es bastante sencillo equivocarse.

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!