SignalR コンポーネントは、SignalR サーバーへの接続にトランスポートとして WebSocket を使用します。このトランスポートがサポートされていない場合、エラーが発生します。
SignalRクライアントコンポーネントには、次のデータを設定できるSignalRというプロパティがあります:
クライアントはテキストまたはバイナリデータの送信をサポートしています。
Hubs API を使用すると、クライアントからサーバーメソッドを、サーバーからクライアントメソッドを呼び出せます。永続接続に使用されるプロトコルは、RPC(リモートプロシージャ呼び出し)セマンティクスを表現できるほどリッチではありません。ただし、これはハブ接続に使用されるプロトコルが、永続接続に使用されるプロトコルとまったく異なるという意味ではありません。むしろ、ハブ接続に使用されるプロトコルは、ほとんどが永続接続用プロトコルの拡張です。
クライアントがサーバーメソッドを呼び出すとき、永続的な接続のような自由形式の文字列は送信しなくなります。代わりに、メソッドの呼び出しに必要な情報をすべて含む JSON 文字列を送信します。クライアントがサーバーメソッドを呼び出すために送信するサンプルメッセージを以下に示します:
WriteData('{"H":"chathub","M":"Send","A":["Delphi Client","Test message"],"I":0}');
ペイロードには以下のプロパティがあります。
I — 呼び出し識別子 — レスポンスをリクエストと照合するために使用されます
H – ハブの名前
M – メソッドの名前
A – arguments(配列。メソッドにパラメータがない場合は空でも構いません)
文字列引数にダブルクォートがある場合は「"」を「\"」に置き換えてください
例: 引数が {"test":1} の場合、引数を {\"test\":1} として送信します
WriteData('{"H":"chathub","M":"Send","A":["{\"test\":1}"],"I":0}');
認証を有効にして、各接続にユーザーを関連付け、どのユーザーがリソースにアクセスできるかをフィルタリングできます。認証はBearer Tokenを使用して実装されます。クライアントはアクセストークンを提供し、サーバーはこのトークンを検証してユーザーを識別するために使用します。
現在 Bearer トークンのみがサポートされています:
ここでは、トークンを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 メッセージを受信したときに発生します。