1. ホーム
  2. asp.net

[解決済み] SignalR - (IUserIdProvider)を使って特定のユーザーにメッセージを送信する *NEW 2.0.0*.

2022-10-01 11:31:19

質問

Asp.Net SignalRの最新バージョンでは、IUserIdProvider"インターフェースを使用して、特定のユーザーにメッセージを送信する新しい方法が追加されました。

public interface IUserIdProvider
{
   string GetUserId(IRequest request);
}

public class MyHub : Hub
{
   public void Send(string userId, string message)
   {
      Clients.User(userId).send(message);
   }
}

私の疑問は、メッセージを送る相手をどうやって知ることができるのか、ということです。この新しいメソッドの説明は、非常に表面的なものです。また、SignalR 2.0.0のドラフト版Statementにはこのバグがあり、コンパイルできません。どなたかこの機能を実装された方はいらっしゃいますか?

より多くの情報: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider

ハグする。

どのように解決するのですか?

SignalRでは、各接続に対してConnectionIdが用意されています。どの接続が誰(ユーザー)のものかを調べるには、接続とユーザーの対応関係を作成する必要があります。これは、アプリケーションでどのようにユーザーを識別するかに依存します。

SignalR 2.0では、これは内蔵の IPrincipal.Identity.Name これは、ASP.NET認証時に設定されたログインユーザー識別子です。

しかし、Identity.Name を使用する代わりに、別の識別子を使用してユーザーとの接続をマッピングする必要がある場合があります。この目的のために、この新しいプロバイダは、ユーザーと接続をマッピングするためのカスタム実装と一緒に使用することができます。

IUserIdProviderを使用したSignalRユーザーと接続の対応付けの例

我々のアプリケーションでは userId を使用して各ユーザーを識別しているとします。ここで、特定のユーザにメッセージを送信する必要があります。このとき userIdmessage というように、ユーザーIDと接続の対応関係を知っている必要があります。

これを実現するために、まず最初に IUserIdProvider :

public class CustomUserIdProvider : IUserIdProvider
{
     public string GetUserId(IRequest request)
    {
        // your logic to fetch a user identifier goes here.

        // for example:

        var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
        return userId.ToString();
    }
}

2番目のステップは、SignalRに私たちの CustomUserIdProvider を使用するように SignalR に指示します。これは、ハブ設定を初期化する際にStartup.csで行うことができます。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var idProvider = new CustomUserIdProvider();

        GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);          

        // Any connection or hub wire up and configuration should go here
        app.MapSignalR();
    }
}

これで、特定のユーザーに対してメッセージを送るには、そのユーザーの userId のように、ドキュメントに書かれているように

public class MyHub : Hub
{
   public void Send(string userId, string message)
   {
      Clients.User(userId).send(message);
   }
}

これが役立つといいのですが。