ASP.NETコア2.2 WEBAPIシリーズ[9]使用SignalR

1. SignalRクライアントライブラリを追加します。

プロジェクトを右クリック - >「追加」を選択>「クライアントライブラリ」 

プロバイダの選択:unpkg 、バンクセレクト:@ ASPNET / SignalR @ 1.1.4

「DIST /ブラウザ」フォルダを展開し、「signalr.js」と「signalr.min.jsを」選択「特定のファイルを選択する」を選択 

あなたは、特定の場所を選択することができます

ハブハブを定義します。2.

MessageHubと継承ハブを作成します。ハブクラスは、接続、およびグループメッセージを管理します

使用してSystem.Collections.Genericを。
使用してSystem.Threading.Tasksを。
使用してMicrosoft.AspNetCore.SignalRを。

名前空間NetCoreWebApi.SignalR 
{ 
    ///  <要約> 
    /// メッセージ集线器
     ///  </要約> 
    パブリック クラスMessageHub:ハブ
    { 
        ///  <要約> 
        /// 存放已连接信息
         ///  </要約> 
        公共 静的な 読み取り専用辞書< 文字列文字列 >接続= 新しい辞書< 文字列文字列 >();
        ///  <要約> 
        /// 发送消息
         ///  </要約> 
        ///  ます。<param name = "loginNo"> </ param>の
        ///  <PARAM NAME = "メッセージ"> </ param>の
        // /  <リターン> </戻り> 
        公共の 非同期タスクのSendMessage(ストリング loginNo、文字列メッセージ)
        { 
            Connections.TryGetValue(loginNo、アウト のclientId)。
            // ReceiveMessage客户端接受方法
            のawait Clients.Client(のclientId).SendAsync(" ReceiveMessage " 、メッセージ)。
         <概要> 
        /// クライアントのログイン・ユーザー・アカウントと正常に保存され、クライアント同上
         ///  </要約> 
        ///  ます。<param name = "loginNo"> </ param>の
        公共 無効 SendLogin(文字列loginNo)
        { 
            // 分析ユーザ着弾していない(Idを介してユーザ名及びログインを挿入しないで、ログインユーザ名、及びIdを変更することによって)
            IF(!Connections.ContainsKey(loginNo))
            { 
                Connections.Add(loginNo、Context.ConnectionId); 
            } 
            
            { 
                接続[loginNo] = Context.ConnectionId; 
            } 
        } 
    } 
}

3.設定SignalR

私たちは、必要がStartup.csはクラス開始ConfigureServices登録SignalRサービス

            services.AddSignalR();

セットSignalRルート

            // カスタムクラスMessageHubにセットSignalR経路 
            app.UseSignalR(ルート=> 
            { 
                route.MapHub <MessageHub>(" / MessageHub " ); 
            });

注:UseSignalR  必要  UseMvcの  前にコール!

4.準備SignalRのクライアントコード

参考signalr.js HTMLにライブラリファイル

<!DOCTYPE HTML > 
< HTML > 
< ヘッド> 
</ ヘッド> 
< ボディ> 
    < divのスタイル= "テキスト整列:センター;マージントップ:5%" > 
        < 入力タイプ= "テキスト" ID = "メッセージ" プレースホルダ=」消息」 /> 
        < ボタンタイプ= "ボタン" ID = "及びSendBtn" >发送</ ボタン> 
    </ DIV > 
    <= "../リソース/ libに/ SignalR / DIST /ブラウザ/ signalr.js" > </ スクリプト> 
</ ボディ> 
</ HTML > 
< スクリプト> 
    のvar 接続=  新しい新signalR.HubConnectionBuilder()
         // 設定ルート
        .withUrl (" / MessageHub " // ログ情報
        .configureLogging(signalR.LogLevel.Information)
         // 作成
        .build();
     // メッセージ受け入れ
    connection.onを(" ReceiveMessage " 、(メッセージ)=>{
        警告(" 收到消息===> "  + メッセージ)。
    }); 
    // 发送消息
    のdocument.getElementById(" 及びSendBtn " ).addEventListener(" クリック" 機能(){
         VARのメッセージ= のdocument.getElementById(' メッセージ' ).VALUE; 
        connection.invoke(" のSendMessage " " tenghao510 @ QQ。 COM 、メッセージ)。キャッチ(ERR => 
            console.error(ERR。
        ); 
    }); 
    // 开始连接
    。connection.start()は(E => { 
        connection.invoke(" SendLogin " " [email protected] " 。)キャッチ(ERR => 
            console.error(err.toString()) 
        )。
    })。キャッチ(ERR => console.error(err.toString()));
</ スクリプト>

5.プログラムを実行します。

htmlページを開き、以下の情報は、接続がコンソールに成功した説明に印刷されて参照するにはF12。

 

 テキストを入力し、送信ボタンをクリックしてください。(I警告ここで、他の要件は、コールバック内部メッセージ処理ロジックで受信することができる場合)

 

コントローラからの情報の6普及

また、ハブに外からメッセージを送信することができます。

コントローラを使用するときは、注入する必要がある  IHubContextの  インスタンスを。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using NetCoreWebApi.SignalR;

namespace NetCoreWebApi.Controllers
{
    /// <summary>
    /// SignalR推送
    /// </summary>
    [Route("api/hub")]
    [ApiController]
    public class HubController : Controller
    {
        private readonly IHubContext<MessageHub> _hubContext;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="hubClients"></param>
        public HubController(IHubContext<MessageHub> hubClients)
        {
            _hubContext = hubClients;
        }
        /// <summary>
        /// 测试SignalR推送
        /// </summary>
        /// <param name="loginNo"></param>
        [HttpGet]
        [Route("pushMsg")]
        public void PushMsg(string loginNo)
        {
            if (string.IsNullOrWhiteSpace(loginNo))
            {
                //给所有人推送消息
                _hubContext.Clients.All.SendAsync("ReceiveMessage", "这是控制器发送的消息");
            }
            else
            {
                //给指定人推送
                MessageHub.Connections.TryGetValue(loginNo, out string id);
                _hubContext.Clients.Client(id).SendAsync("ReceiveMessage", "这是控制器发送的消息");
            }
        }
    }
}

调用接口测试

おすすめ

転載: www.cnblogs.com/tenghao510/p/11937953.html