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のメソッドのみを呼び出すことができます.
  • クライアントがサーバのハブクラスにアクセスするたびに、新しいオブジェクトインスタンス上で実行されるため、ハブクラスにステータスを格納することはできません.
  • SignalRのコードは非同期モードなので、ハブの方法も非同期です.
  • 四、パラメータと戻りタイプ


    ハブクラスとクライアント受信コードを次のように変更します.
    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をユーザ識別子として使用する.
    UserClaimsPrincipalの現在のユーザに関連付けられているものを取得します.
    Items
    この接続の範囲内でデータを共有するために使用できるキー/値のセットを取得します.データは、このセットに格納され、異なるハブメソッド呼び出しで永続的に保存されます.
    Features
    接続で使用可能な機能のセットを取得します.現在、ほとんどの場合、このコレクションは必要ありませんので、詳細には説明しません.
    ConnectionAborted
    接続が中止されたときに通知されるCancellationTokenを取得します.
    方法
    説明
    GetHttpContext
    接続HttpContextnullを返し、接続が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);
    }