O componente SignalR usa WebSocket como transporte para conectar a um servidor SignalR; se este transporte não for suportado, um erro será gerado.
O componente cliente SignalR tem uma propriedade chamada SignalR onde você pode definir os seguintes dados:
O cliente suporta o envio de dados Text ou Binary.
A Hubs API torna possível invocar métodos do servidor a partir do cliente e métodos do cliente a partir do servidor. O protocolo utilizado para conexão persistente não é rico o suficiente para permitir expressar a semântica de RPC (remote procedure call). Isso não significa, no entanto, que o protocolo utilizado para conexões de hub seja completamente diferente do protocolo utilizado para conexões persistentes. Em vez disso, o protocolo utilizado para conexões de hub é, em sua maior parte, uma extensão do protocolo para conexões persistentes.
Quando um cliente invoca um método do servidor, ele não envia mais uma string de fluxo livre como era o caso para conexões persistentes. Em vez disso, ele envia uma string JSON contendo todas as informações necessárias para invocar o método. Aqui está um exemplo de mensagem que um cliente enviaria para invocar um método do servidor:
WriteData('{"H":"chathub","M":"Send","A":["Delphi Client","Test message"],"I":0}');
O payload possui as seguintes propriedades:
I – identificador de invocação – permite que você associe respostas com requisições
H – o nome do hub
M – o nome do método
A – arguments (um array, pode estar vazio se o método não tiver nenhum parâmetro)
Se o argumento string tiver aspas duplas, substitua " por \"
Exemplo: se o argumento é {"test":1}, envie o argumento como {\"test\":1}
WriteData('{"H":"chathub","M":"Send","A":["{\"test\":1}"],"I":0}');
A autenticação pode ser habilitada para associar um usuário a cada conexão e filtrar quais usuários podem acessar recursos. A autenticação é implementada utilizando Bearer Tokens: o cliente fornece um access token e o servidor valida este token e o utiliza para identificar o usuário.
Atualmente, apenas Bearer Tokens são suportados:
Aqui, você passa o token diretamente ao servidor Signal (porque o token foi obtido de outro servidor).
Authentication.Enabled: se ativo, a autorização será utilizada antes de uma conexão websocket ser estabelecida.
Authentication.Authentication: 2 tipos de autenticação são suportados: bearer token ou cookies. Ambos requerem uma forma externa de obter os valores necessários.
BearerToken: valor do token obtido.
Cookie: define o valor do cookie necessário.
oSignalR := TsgcWSAPI_Signal.Create(nil);
oSignalR.SignalR.Enabled := True;
oSignalR.SignalR.Authentication := srcBearerToken;
oSignalR.SignalR.BearerToken.Token := 'token here';
O componente tem os seguintes eventos:
Este evento é gerado quando o cliente se conecta com sucesso ao servidor.
Este evento é gerado quando o cliente é desconectado do servidor.
Este evento é chamado quando há um erro na conexão WebSocket.
O protocolo utilizado para a conexão persistente é bastante simples. As mensagens enviadas ao servidor são apenas strings brutas. Não há um formato específico em que elas devam estar. As mensagens enviadas ao cliente são mais estruturadas. As propriedades que você pode encontrar na mensagem são as seguintes:
C – id da mensagem, presente em todas as mensagens que não são KeepAlive
M – um array contendo os dados reais.
{"C":"d-9B7A6976-B,2|C,2","M":["Welcome!"]}
Este evento é chamado quando dados binários são recebidos do servidor.
Quando um método do servidor é invocado, o servidor retorna uma confirmação de que a invocação foi concluída enviando o id da invocação ao cliente e — se o método retornou um valor — o valor de retorno, ou — se a invocação do método falhou — o erro.
Aqui estão exemplos de resultados de uma chamada de método do servidor:
{"I":"0"}
Um método void do servidor cujo identificador de invocação era "0" foi concluído com sucesso.
{"I":"0", "R":42}
Um método de servidor que retorna um número cujo identificador de invocação era "0" foi concluído com sucesso e retornou o valor 42.
{"I":"0", "E":"Error occurred"}
Este evento é gerado quando uma mensagem KeepAlive é recebida do servidor.