ASP.NET Core SignalR:ハブHubs
8912 ワード
一、ハブhubsとは
SignalRのハブhubsで定義されたメソッドにより、サーバは接続中のクライアント定義のメソッドを呼び出すことができ、クライアントはサーバ側ハブで定義されたメソッドを呼び出すことができる.SignalRはクライアントとサーバ間のリアルタイム通信を実現する責任を負う.
二、SignalRを配置するhubs
SignalRはStartupを通過する.ConfigureServicesでサービスを呼び出す.AddSignalR()は、ミドルウェアサービスを構成します.
services.AddSignalR()
SignalR機能をASPに追加する.NET Coreアプリケーションの場合、Startup.Configureメソッドでappを呼び出す.UseSignalRは、SignalRルーティングを設定します.app.UseSignalR(routes =>
{
routes.MapHub("/Hub");
});
三、ハブHubsの作成
Hubクラスを継承してハブクラスを作成し、public修飾のメソッドを追加します.メソッドの名前は、プロパティ[HubMethodName]で変更できます.
public async Task SendMessage(string user,string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
注意:四、パラメータと戻りタイプ
ハブクラスとクライアント受信コードを次のように変更します.
public class paramsEntity
{
public string user { get; set; }
public string message { get; set; }
}
public async Task SendMessage(paramsEntity param)
{
await Clients.All.SendAsync("ReceiveMessage", param);
}
// ReceiveMessage
connection.on("ReceiveMessage", function (param) {
if (param.user)
$('#content').append(param.user + ":");
if (param.message)
$('#content').append(param.message + ":");
});
// SendMessage
connection.invoke("SendMessage", { user, message }).catch(function (err) {
return console.error(err.toString());
});
実行すると、SignalRはシーケンス化と逆シーケンス化によって複雑なパラメータと戻りタイプを処理することがわかります.クライアントが渡すパラメータとサーバ側が一致しないと、メソッドが一致せず、次のエラーが発生します.Microsoft.AspNetCore.SignalR.HubException: Failed to invoke 'SendMessage' due to an error on the server.
したがって、カスタムオブジェクトをパラメータとして使用すると、より柔軟に変化します.五、Hubの対象
1、Context
Hubクラスには、接続の次の属性とメソッドを含むコンテキストContextがあります.
ツールバーの
説明
ConnectionId
SignalRによって割り当てられた接続の一意のIDを取得します.各接続には接続IDが1つあります
UserIdentifier
ユーザー識別子を取得します.デフォルトでは、SignalRは、接続
ClaimTypes.NameIdentifier
に関連付けられたClaimsPrincipal
をユーザ識別子として使用する.User
ClaimsPrincipal
の現在のユーザに関連付けられているものを取得します.Items
この接続の範囲内でデータを共有するために使用できるキー/値のセットを取得します.データは、このセットに格納され、異なるハブメソッド呼び出しで永続的に保存されます.
Features
接続で使用可能な機能のセットを取得します.現在、ほとんどの場合、このコレクションは必要ありませんので、詳細には説明しません.
ConnectionAborted
接続が中止されたときに通知される
CancellationToken
を取得します.方法
説明
GetHttpContext
接続
HttpContext
のnull
を返し、接続がHTTP要求に関連付けられていない場合は.HTTP接続の場合、この方法を使用して、HTTPヘッダやクエリー文字列などの情報を取得できます.Abort
接続を中止します.
2、Clients
HubクラスのClientsプロパティには、サーバとクライアント間の通信方法とプロパティが含まれます.
ツールバーの
説明
All
すべての接続クライアントでメソッドを呼び出す
Caller
ハブメソッドを呼び出すクライアントでメソッドを呼び出す
Others
すべての接続されたクライアントでメソッドを呼び出すが、メソッドを呼び出すクライアントを除く
方法
説明
AllExcept
すべての接続クライアント(指定した接続を除く)でメソッドを呼び出す
Client
特定の接続クライアントでメソッドを呼び出す
Clients
複数の特定の接続のクライアントでメソッドを呼び出す
Group
指定したグループ内のすべての接続の呼び出し方法
GroupExcept
指定したグループ内のすべての接続呼び出しメソッドに対して、指定した接続を除く
Groups
マルチグループ接続でメソッドを呼び出す
OthersInGroup
ハブメソッドを呼び出すクライアントを含まない接続呼び出しメソッドのセット
User
特定のユーザーに関連付けられたすべての接続の呼び出し方法
Users
指定したユーザーに関連付けられたすべての接続の呼び出し方法
表の各プロパティまたはメソッドは、メソッドを含む
SendAsync
のオブジェクトを返します.SendAsync
メソッドを使用すると、呼び出すクライアントメソッドの名前とパラメータを指定できます.六、強いタイプのhub
SendAsyncを使用する場合は、クライアントを呼び出す方法を指定するために文字列を入力する必要があります.これにより、スペルエラーなどの問題でプログラムの実行エラーが発生します.
強いタイプのHubを使用してクライアントのメソッドをインタフェースとして約定すると、HubのClientsはSendasyncメソッドを無効にし、我々が約定したインタフェースメソッドのみを呼び出すことができます.
public interface IHub
{
Task ReceiveMessage(string user, string message);
Task ReceiveMessage(string message);
}
public class BaseHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
}
}
七、接続イベントの処理
SignalRのhubは、接続を管理および追跡するための
OnConnectedAsync
およびOnDisconnectedAsync
の仮想メソッドを提供する.OnConnectedAsync
仮想メソッドを書き換えて、クライアントがハブに接続されたときに、グループに追加するなどの操作を実行します.public override async Task OnConnectedAsync()
{
await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnConnectedAsync();
}
OnDisconnectedAsync
仮想メソッドを書き換えて、クライアントが接続を切断したときに操作を実行します.クライアントが意図的に接続を切断した場合(例えば、connection.stop()
、呼び出しによって)、exception
パラメータはnull
となる.ただし、クライアントがネットワーク障害などのエラーで接続を切断した場合、exception
パラメータには、失敗を記述する例外が含まれます.public override async Task OnDisconnectedAsync(Exception exception)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
await base.OnDisconnectedAsync(exception);
}