Il componente SignalR utilizza WebSocket come trasporto per connettersi a un server SignalR; se questo trasporto non è supportato, verrà generato un errore.
Il componente client SignalR ha una proprietà chiamata SignalR dove è possibile impostare i seguenti dati:
Il client supporta l'invio di dati di tipo Testo o Binario.
L'API Hubs consente di invocare metodi del server dal client e metodi del client dal server. Il protocollo utilizzato per la connessione persistente non è sufficientemente ricco da consentire la semantica RPC (chiamata di procedura remota). Ciò non significa tuttavia che il protocollo utilizzato per le connessioni hub sia completamente diverso da quello usato per le connessioni persistenti. Piuttosto, il protocollo per le connessioni hub è principalmente un'estensione di quello per le connessioni persistenti.
Quando un client invoca un metodo del server, non invia più una stringa a flusso libero come accadeva per le connessioni persistenti. Invece, invia una stringa JSON contenente tutte le informazioni necessarie per invocare il metodo. Ecco un messaggio di esempio che un client invierebbe per invocare un metodo del server:
WriteData('{"H":"chathub","M":"Send","A":["Delphi Client","Test message"],"I":0}');
Il payload ha le seguenti proprietà:
I – identificatore di invocazione – consente di abbinare le risposte alle richieste
H – il nome dell'hub
M – il nome del metodo
A – argomenti (un array, può essere vuoto se il metodo non ha parametri)
Se l'argomento stringa contiene doppie virgolette sostituire " con \"
Esempio: se l'argomento è {"test":1}, inviare l'argomento come {\"test\":1}
WriteData('{"H":"chathub","M":"Send","A":["{\"test\":1}"],"I":0}');
L'autenticazione può essere abilitata per associare un utente a ogni connessione e filtrare quali utenti possono accedere alle risorse. L'autenticazione viene implementata tramite Bearer Token: il client fornisce un token di accesso e il server convalida questo token e lo utilizza per identificare l'utente.
Attualmente sono supportati solo i Bearer Token:
Qui si passa il token direttamente al server Signal (poiché il token è stato ottenuto da un altro server).
Authentication.Enabled: se attivo, verrà utilizzata l'autorizzazione prima che venga stabilita una connessione websocket.
Authentication.Authentication: Sono supportati 2 tipi di autenticazione: bearer token o cookie. Entrambi richiedono un modo esterno per ottenere i valori richiesti.
BearerToken: valore del token ottenuto.
Cookie: impostare il valore del cookie richiesto.
oSignalR := TsgcWSAPI_Signal.Create(nil);
oSignalR.SignalR.Enabled := True;
oSignalR.SignalR.Authentication := srcBearerToken;
oSignalR.SignalR.BearerToken.Token := 'token here';
Il componente ha i seguenti eventi:
Questo evento viene sollevato quando il client si connette con successo al server.
Questo evento viene generato quando il client si disconnette dal server.
Questo evento viene chiamato quando si verifica un errore nella connessione WebSocket.
Il protocollo utilizzato per la connessione persistente è abbastanza semplice. I messaggi inviati al server sono semplici stringhe grezze, senza un formato specifico. I messaggi inviati al client sono più strutturati. Le proprietà presenti nel messaggio sono le seguenti:
C – id del messaggio, presente per tutti i messaggi non KeepAlive
M – un array contenente i dati effettivi.
{"C":"d-9B7A6976-B,2|C,2","M":["Welcome!"]}
Questo evento viene chiamato quando vengono ricevuti dati binari dal server.
Quando viene richiamato un metodo server, il server restituisce una conferma che l'invocazione è completata inviando l'ID di invocazione al client e – se il metodo ha restituito un valore – il valore restituito, oppure – se l'invocazione del metodo è fallita – l'errore.
Di seguito sono riportati esempi di risultati di una chiamata a un metodo del server:
{"I":"0"}
Un metodo server void il cui identificatore di invocazione era "0" è stato completato con successo.
{"I":"0", "R":42}
Un metodo server che restituisce un numero il cui identificatore di invocazione era "0" è stato completato correttamente e ha restituito il valore 42.
{"I":"0", "E":"Error occurred"}
Questo evento viene sollevato quando viene ricevuto un messaggio KeepAlive dal server.