asp.Netcore使用signalR(一)

4748 ワード

asp.Netcore使用signalR(一)
Intro
SignalRとは何ですか.
ASP.NET Core SignalRは、アプリケーションにリアルタイムWeb機能を追加するプロセスを簡素化するオープンソースライブラリです.リアルタイムWeb機能により、サーバ側コードがリアルタイムでクライアントにコンテンツをプッシュできるようになります.
SignalRの適用対象:
  • は、サーバからの高周波更新アプリケーションを必要とする.例えば、ゲーム、ソーシャルネットワーク、投票、オークション、地図、GPSアプリケーションなどです.
  • ダッシュボードと監視アプリケーション.例には、企業ダッシュボード、販売ステータスの即時更新、またはストローク警告が含まれます.
  • コラボレーションアプリケーション.コラボレーションアプリケーションの例には、ホワイトボードアプリケーションとチームミーティングソフトウェアが含まれます.
  • 通知が必要なアプリケーション.ソーシャルネットワーク、Eメール、チャット、ゲーム、スケジュール警告、その他の多くのアプリケーションで通知が使用されています.

  • SignalRは、クライアントへのサーバのリモート・プロシージャ呼び出し(RPC)を作成するためのAPIを提供します.RPCは、サーバ側.NET Coreコードを介してクライアント上のJavaScript関数を呼び出します.
    以下、ASP.NET Core SignalRのいくつかの機能:
  • 接続を自動的に管理します.
  • は、すべての接続されたクライアントに同時にメッセージを送信する.例えば、チャットルーム.
  • は、メッセージを特定のクライアントまたはクライアントグループに送信する.
  • は、増加したトラフィックを処理するために拡張される.

  • トランスファ
    SignalRは、リアルタイム通信を処理するためのいくつかの方法をサポートします.
  • WebSockets
  • サーバ送信イベント
  • ロングポーリングSignalRは、サーバおよびクライアントがサポートする機能から最適な伝送方法
  • を自動的に選択する.
    最近、クライアントとサーバ側の通信を実現するためにwebsocketを使用し、サーバ側が使用するSignalRのような対戦ゲームをしています.
    SignR基本使用
    サービス登録
    サービス構成は次のとおりです.
    services.AddSignalR(options =>
        {
            options.HandshakeTimeout = TimeSpan.FromSeconds(3);
            options.KeepAliveInterval = TimeSpan.FromSeconds(10);
        })
        // JSON      
        .AddJsonProtocol(options =>
        {
            options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
            options.PayloadSerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
            options.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            options.PayloadSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        });
    

    認証方式の構成
    デフォルトのTokenは、要求ヘッダAuthorizationから取得されるが、signalrがサーバ側を要求する場合は、要求アドレスのquery string access-tokenに格納されるので、要求ヘッダから取得するか、QueryStringから取得するように構成する.
    services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddIdentityServerAuthentication(options =>
        {
            options.Authority = Configuration["Authorization:Authority"];
            options.RequireHttpsMetadata = false;
    
            options.TokenRetriever = request =>
            {
                var token = TokenRetrieval.FromAuthorizationHeader()(request);
                if (string.IsNullOrWhiteSpace(token))
                {
                    token = TokenRetrieval.FromQueryString()(request);
                }
    
                return token;
            };
        });

    コンフィギュレーション
    
    app.UseAuthentication();
    
    app.UseSignalR(builder =>
    {
        builder.MapHub("/hubs/quizGame"); //    Hub
    });
    
    app.UseMvc();

    カスタムHub
    Hub契約の定義
    クライアントメソッドのインタフェースを定義して、強いタイプのクライアントメソッド呼び出しを実現します.ここで、クライアント呼び出しサーバ側のメソッドは、次のようなインタフェースを定義します.
    /// 
    ///         
    /// 
    public interface IQuizGameClient
    {
        Task GameQuestionsReceived(QuizQuestion question);
    
        Task MatchSuccess(GameInfo gameInfo);
    
       Task GameAnswerResultReceived(CheckedUserQuizAnswerModel answer);
    
        Task GameOver(GameResult result);
    }
    
    /// 
    ///          
    /// 
    public interface IQuizGameServer
    {
        Task>> GetGameRules();
    
        Task AutoMatch(int ruleId);
    
        Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId);
    }

    Hubの定義
    契約があれば、強いタイプのHubを定義することができます.例は以下の通りです.
    [Authorize(Policy = "bearer")]
    public partial class QuizGameHub : Hub, IQuizGameServer
    {
    
        public Task>> GetGameRules()
        {
            return Task.FromResult(ServiceResult.Success(QuizGameStorage.GameRuleInfos));
        }
        
        // ...
    
        public async Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId)
        {
            //        
            await Clients.User(Context.UserIdentifier)
                .GameAnswerResultReceived(checkedResult); //          
        }
        
        public async Task AutoMatch(int ruleId)
        {
            // ...
        }
    }

    Reference
  • https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.2
  • https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-2.2

  • 転載先:https://www.cnblogs.com/weihanli/p/use-signalr-in-aspnetcore.html