SignalR 组件使用 WebSocket 作为传输方式连接到 SignalR 服务器,若不支持此传输方式,将引发错误。
SignalR 客户端组件有一个名为 SignalR 的属性,您可以在其中设置以下数据:
客户端支持发送文本或二进制数据。
Hubs API 使从客户端调用服务器方法以及从服务器调用客户端方法成为可能。用于持久连接的协议功能不够丰富,无法直接表达 RPC(远程过程调用)语义。但这并不意味着用于 Hub 连接的协议与用于持久连接的协议完全不同。事实上,Hub 连接使用的协议主要是持久连接协议的扩展。
当客户端调用服务器方法时,不再像持久连接那样发送自由格式的字符串,而是发送一个包含调用该方法所需所有信息的 JSON 字符串。以下是客户端调用服务器方法时发送的示例消息:
WriteData('{"H":"chathub","M":"Send","A":["Delphi Client","Test message"],"I":0}');
载荷具有以下属性:
I——调用标识符——用于将响应与请求进行关联
H – hub 的名称
M — 方法名称
A – 参数(一个数组,如果方法没有任何参数则可以为空)
如果字符串参数包含双引号,请将 " 替换为 \"
示例:如果参数为 {"test":1},请将参数发送为 {\"test\":1}
WriteData('{"H":"chathub","M":"Send","A":["{\"test\":1}"],"I":0}');
可以启用身份验证,将用户与每个连接关联,并过滤哪些用户可以访问资源。身份验证使用 Bearer 令牌实现:客户端提供访问令牌,服务器验证此令牌并使用它来识别用户。
目前仅支持 Bearer Token:
在此,您将令牌直接传递给 Signal 服务器(因为令牌已从另一台服务器获取)。
Authentication.Enabled:如果激活,在建立 WebSocket 连接之前将使用授权。
Authentication.Authentication:支持 2 种认证类型:Bearer 令牌或 Cookie。两者均需要外部方式来获取所需的值。
BearerToken:获取的令牌值。
Cookie:设置所需 Cookie 的值。
oSignalR := TsgcWSAPI_Signal.Create(nil);
oSignalR.SignalR.Enabled := True;
oSignalR.SignalR.Authentication := srcBearerToken;
oSignalR.SignalR.BearerToken.Token := 'token here';
该组件具有以下事件:
当客户端成功连接到服务器时触发此事件。
当客户端从服务器断开时触发此事件。
当 WebSocket 连接发生错误时调用此事件。
用于持久连接的协议非常简单。发送到服务器的消息只是原始字符串,没有特定的格式要求。发送给客户端的消息则更有结构。您可以在消息中找到以下属性:
C — 消息 ID,所有非 KeepAlive 消息均存在
M — 包含实际数据的数组。
{"C":"d-9B7A6976-B,2|C,2","M":["Welcome!"]}
当从服务器收到二进制数据时,将调用此事件。
当服务器方法被调用时,服务器会返回调用已完成的确认,向客户端发送调用 id,以及如果方法有返回值则发送该返回值;如果调用方法失败则发送错误。
以下是服务器方法调用的示例结果:
{"I":"0"}
调用标识符为 "0" 的服务器 void 方法已成功完成。
{"I":"0", "R":42}
调用标识符为 "0" 的服务器方法成功完成并返回值 42。
{"I":"0", "E":"Error occurred"}
当从服务器收到 KeepAlive 消息时触发此事件。