ASP.NET Core SignalR の概要

完了

インターネットに接続されているアプリケーションはすべて、サーバーとクライアントで構成されます。 クライアントは、データについてサーバーに依存しており、クライアントがデータを受信する主なメカニズムとして、ハイパーテキスト転送プロトコル (HTTP) 要求を使用しています。 一部のクライアント アプリケーションでは、頻繁に変更されるデータが必要になります。

ASP.NET Core SignalR には、サーバーとクライアントの間のリモート プロシージャ コール (RPC) を作成するための API が用意されています。 RPC では、サーバー側の .NET Core コードからクライアントの関数を呼び出します。 サポートされているプラットフォームはいくつかあり、それぞれに独自のクライアント SDK があります。 そのため、RPC 呼び出しによって呼び出されるプログラミング言語は異なる可能性があります。

SignalR に関連する一般的な用語を理解しておくと便利です。 このユニットでは、サーバー アプリケーションとクライアント アプリケーションのそれぞれで、どのような SignalR コンポーネントが必要かを学習します。 また、さまざまな双方向通信メカニズムについても学習します。 SignalR では、複数のリアルタイム プロトコルをカプセル化することにより、それぞれを実装する複雑さを解消しています。 詳細については、ASP.NET Core SignalR のドキュメントを参照してください。

SignalR で使用される主な用語については、次のセクションで説明します。

トランスポート

SignalR では、リアルタイム通信を処理するための次の技法 ("トランスポート") をサポートしています。

  1. WebSocket
  2. サーバー送信イベント
  3. Long Polling

次のトランスポートの順序は、正常なフォールバックの順序を示します。 つまり、WebSocket はサーバー送信イベントより優先され、サーバー送信イベントは長いポーリングよりも優先されます。ただし、これらのトランスポートのいずれでも使用できます。 SignalR では、サーバーとクライアントの機能の範囲内で最適なトランスポート方法を自動的に選択します。 詳細については、SignalR トランスポート プロトコルに関する公式仕様を参照してください。

サーバー

サーバーは、SignalR エンドポイントを公開する役割を担います。 エンドポイントは、Hub または Hub<T> サブクラスにマップされます。 サーバーは、オンプレミス、クラウド プロバイダー (Azure など)、または Azure SignalR Service で存在できます。 サーバーは、クライアントから呼び出すことができるハブ メソッドと、クライアントがサブスクライブできるイベントの両方を公開します。 これらはリモート プロシージャと見なされます。

ハブ

SignalR では、"ハブ" はクライアントとサーバーの間の通信のために使用されます。 ハブは、クライアントとサーバーが相互にメソッドを呼び出すことができるようにする、高レベルのパイプラインです。 この目的で、SignalR はマシンの境界を越えたディスパッチを自動的に処理します。 ハブは、すべての接続済みクライアントとサーバーとの間のプロキシと見なすことができます。

プロトコル

SignalR プロトコルは、任意のメッセージベースのトランスポートを経由した双方向 RPC のプロトコルです。 接続のどちらの側も他方の側でプロシージャを呼び出すことができ、プロシージャは 0 個以上の結果またはエラーを返すことができます。 SignalR には、次の 2 つのビルトイン ハブ プロトコルが用意されています。

  • JSON に基づくテキスト プロトコル (既定)。
  • MessagePack に基づくバイナリ プロトコル。これは、通常 JSON より小さいメッセージを生成します。

MessagePack プロトコルを使用するには、サーバーとクライアントの両方がその構成をオプトインする必要があり、サーバーとクライアントの両方がそれをサポートする必要があります。 BlazorPack と呼ばれる 3 番目のハブ プロトコルがありますが、このプロトコルは Blazor-Server アプリケーションでのみ使用されます。 これは、Blazor-Server ホスティング モデル "なし" では使用できません。 詳細については、SignalR ハブ プロトコルに関する公式仕様を参照してください。

ユーザー

システム内のユーザーは、個人として機能しますが、グループの一部にもなれます。 メッセージはグループに送信でき、すべてのグループ メンバーに通知されます。 1 人のユーザーが複数のクライアント アプリケーションから接続できます。 たとえば、同じユーザーがモバイル デバイスと Web ブラウザーを使用して、両方でリアルタイムの更新を同時に取得できます。

グループ

グループは、1 つ以上の接続で構成されます。 サーバーでは、グループの作成、グループへの接続の追加、グループからの接続の削除を行えます。 グループには、その一意識別子として機能する名前が指定されています。 グループは、メッセージを絞るのに役立つスコープ メカニズムとして機能します。 つまり、名前付きグループ内のユーザーにのみリアルタイム機能を送信できます。

つながり

ハブへの接続は、サーバーとクライアントによってのみ認識される一意識別子によって表されます。 ハブの種類ごとに 1 つの接続が存在します。 各クライアントには、サーバーへの一意の接続があります。 つまり、複数のクライアントで 1 人のユーザーを表すことができますが、各クライアント接続には独自の識別子が存在します。

クライアント

クライアントは、HubConnection オブジェクトを介してサーバーのエンドポイントへの接続を確立する役割を担います。 ハブ接続は、各ターゲット プラットフォーム内で次のように表されます。

詳細については、「ASP.NET Core SignalR でサポートされているプラットフォーム」を参照してください。

ハブ接続インスタンスが正常に開始されると、メッセージは双方向に自由にフローします。 ユーザーは、通知をサーバーに通信することも、通知をサーバーから受信することも自由にできます。 クライアントは接続されている任意のアプリケーションです。たとえば、Web ブラウザー、モバイル アプリ、デスクトップ アプリなどです。