API SignalR

SignalR

 

El componente SignalR usa WebSocket como transporte para conectarse a un servidor SignalR; si este transporte no es compatible, se generará un error.

El componente cliente SignalR tiene una propiedad llamada SignalR donde puede configurar los siguientes datos:

 

 

El cliente admite el envío de datos de tipo Text o Binary.

 

 

Mensajes de Hubs

 

La API de Hubs permite invocar métodos del servidor desde el cliente y métodos del cliente desde el servidor. El protocolo utilizado para la conexión persistente no es suficientemente rico para expresar la semántica RPC (llamada a procedimiento remoto). Sin embargo, esto no significa que el protocolo utilizado para las conexiones de hub sea completamente diferente del utilizado para las conexiones persistentes. En realidad, el protocolo utilizado para las conexiones de hub es en su mayor parte una extensión del protocolo para conexiones persistentes.

 

Cuando un cliente invoca un método del servidor ya no envía una cadena de flujo libre como ocurría con las conexiones persistentes. En su lugar, envía una cadena JSON que contiene toda la información necesaria para invocar el método. Aquí hay un mensaje de muestra que un cliente enviaría para invocar un método del servidor:

 


WriteData('{"H":"chathub","M":"Send","A":["Delphi Client","Test message"],"I":0}');

 

El payload tiene las siguientes propiedades:

I — identificador de invocación — permite relacionar las respuestas con las solicitudes

H – el nombre del hub

M – el nombre del método

A – argumentos (un array, puede estar vacío si el método no tiene parámetros)

 

 

Si el argumento de cadena contiene comillas dobles, reemplace " por \"

 

Ejemplo: si el argumento es {"test":1}, envíe el argumento como {\"test\":1}

 

WriteData('{"H":"chathub","M":"Send","A":["{\"test\":1}"],"I":0}');

 

Autorización

Se puede habilitar la autenticación para asociar un usuario con cada conexión y filtrar qué usuarios pueden acceder a los recursos. La autenticación se implementa mediante Bearer Tokens: el cliente proporciona un token de acceso y el servidor valida este token y lo utiliza para identificar al usuario.

 

Actualmente solo se admiten Bearer Tokens:

 

Aquí, el token se pasa directamente al servidor Signal (porque el token se ha obtenido de otro servidor).

 

 

 


oSignalR := TsgcWSAPI_Signal.Create(nil);
oSignalR.SignalR.Enabled := True;
oSignalR.SignalR.Authentication := srcBearerToken;
oSignalR.SignalR.BearerToken.Token := 'token here';

El componente tiene los siguientes eventos:

 

OnSignalRConnect

Este evento se genera cuando el cliente se conecta exitosamente al servidor.

 

OnSignalRDisconnect

Este evento se dispara cuando el cliente se desconecta del servidor.

 

OnSignalRError

Este evento se invoca cuando se produce un error en la conexión WebSocket.

 

OnSignalRMessage

El protocolo utilizado para la conexión persistente es bastante simple. Los mensajes enviados al servidor son cadenas de texto sin formato. No tienen que seguir ningún formato específico. Los mensajes enviados al cliente tienen una estructura más definida. Las propiedades que puede encontrar en el mensaje son las siguientes:

 

C – id de mensaje, presente en todos los mensajes que no sean KeepAlive

M – un array que contiene los datos reales.

 


{"C":"d-9B7A6976-B,2|C,2","M":["Welcome!"]}

 

OnSignalRBinary

Este evento se llama cuando se reciben datos binarios del servidor.

 

OnSignalRResult

Cuando se invoca un método del servidor, el servidor devuelve una confirmación de que la invocación se ha completado enviando el ID de invocación al cliente y, si el método devolvió un valor, el valor de retorno, o, si la invocación del método falló, el error.

A continuación se muestran resultados de ejemplo de una llamada a un método del servidor:

 


{"I":"0"}

 

Un método void del servidor cuyo identificador de invocación era "0" se completó correctamente.

 


{"I":"0", "R":42}

 

Un método de servidor que devuelve un número cuyo identificador de invocación era "0" se completó correctamente y devolvió el valor 42.

 


{"I":"0", "E":"Error occurred"}

 

OnSignalRKeepAlive

Este evento se genera cuando se recibe un mensaje KeepAlive del servidor.