ASP.NET Core 2.2 WebApi 系列【九】使用SignalR

来源:https://www.cnblogs.com/tenghao510/archive/2019/11/28/11937953.html
-Advertisement-
Play Games

1.添加 SignalR 客戶端庫 右鍵點擊項目->然後選擇“添加” >“客戶端庫” 提供程式選擇:unpkg ,庫選擇:@aspnet/[email protected] 選擇“選擇特定文件” ,展開“dist/browser” 文件夾,然後選擇“signalr.js” 和“signalr.min.js” ...


1.添加 SignalR 客戶端庫

右鍵點擊項目->然後選擇“添加” >“客戶端庫” 

提供程式選擇:unpkg ,庫選擇:@aspnet/[email protected]

選擇“選擇特定文件” ,展開“dist/browser” 文件夾,然後選擇“signalr.js” 和“signalr.min.js” 

選擇指定位置安裝即可

2.定義Hub集線器

創建MessageHub 並繼承Hub。Hub類管理連接、組和消息

using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace NetCoreWebApi.SignalR
{
    /// <summary>
    /// Message集線器
    /// </summary>
    public class MessageHub : Hub
    {
        /// <summary>
        /// 存放已連接信息
        /// </summary>
        public static readonly Dictionary<string, string> Connections = new Dictionary<string, string>();
        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="loginNo"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public async Task SendMessage(string loginNo, string message)
        {
            Connections.TryGetValue(loginNo, out string clientId);
            //ReceiveMessage 客戶端接受方法
            await Clients.Client(clientId).SendAsync("ReceiveMessage", message);
        }
        /// <summary>
        /// 客戶端登錄成功保存用戶賬號和客戶端Id
        /// </summary>
        /// <param name="loginNo"></param>
        public void SendLogin(string loginNo)
        {
            //判斷用戶有沒有登陸過(沒登陸過插入用戶名和Id,登陸過修改用戶名和Id)
            if (!Connections.ContainsKey(loginNo))
            {
                Connections.Add(loginNo, Context.ConnectionId);
            }
            else
            {
                Connections[loginNo] = Context.ConnectionId;
            }
        }
    }
}

3.配置SignalR

我們需要在Startup.cs啟動類的ConfigureServices註冊SignalR服務

            services.AddSignalR();

設置SignalR路由

            //設置SignalR路由,指向自定義類MessageHub
            app.UseSignalR(route =>
            {
                route.MapHub<MessageHub>("/MessageHub");
            });

註意:UseSignalR 必須在 UseMvc 之前調用!

4.編寫SignalR 客戶端代碼

引用signalr.js類庫文件到html中

<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
    <div style="text-align: center;margin-top: 5%">
        <input type="text" id="message" placeholder="消息" />
        <button type="button" id="sendBtn">發送</button>
    </div>
    <script src="../Resources/lib/signalr/dist/browser/signalr.js"></script>
</body>
</html>
<script>
    var connection = new signalR.HubConnectionBuilder()
        //配置路由
        .withUrl("/MessageHub")
        //日誌信息
        .configureLogging(signalR.LogLevel.Information)
        //創建
        .build();
    //接受消息
    connection.on("ReceiveMessage", (message) => {
        alert("收到消息===>" + message);
    });
    //發送消息
    document.getElementById("sendBtn").addEventListener("click", function () {
        var message = document.getElementById('message').value;
        connection.invoke("SendMessage", "[email protected]", message).catch(err =>
            console.error(err.toString())
        );
    });
    //開始連接
    connection.start().then(e => {
        connection.invoke("SendLogin", "[email protected]").catch(err =>
            console.error(err.toString())
        );
    }).catch(err => console.error(err.toString()));
</script>

5.運行程式

打開html頁面,F12在 Console 看到列印以下信息說明連接成功。

 

 輸入文字,點擊發送按鈕。(我這裡是alert,如有其它需求,可在接收消息回調裡面處理邏輯)

 

6.從控制器發佈消息

將消息從外部發送到 hub。當使用控制器時,需要註入一個 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", "這是控制器發送的消息");
            }
        }
    }
}

調用介面測試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於非純字元串組成的列表,需要使用map(str, 列表)轉換,純字元串組成的列表則不需要轉換 ...
  • 1.python之logger日誌通用配置文件 2.放入項目即可直接使用 ...
  • Intellj IDEA快捷鍵入門 之 Ctrl+Space(空格) 時間 :2019/11/28 系統 :Win10系統 背景 : 步驟 : 1.win 設置 時間和語言 語言 添加語言 2.這裡選最基本的就好,不想選亂七八糟的,點擊"安裝" 3.安裝完成後(重啟完成後),這裡就會有兩種語言,把E ...
  • 正則匹配並且可以捕獲到()這個裡面的子表達式的值,linux的grep命令沒辦法捕獲子表達式的值,只能獲取到整條正則匹配的內容 上面的正則中驗證了.*是貪婪 .*?是非貪婪 ,下麵匹配的字元串切片第一條是整條數據,後面的每一個對應正則括弧里捕獲的內容 tao@tao-PC:/var/www/html ...
  • 上一篇說瞭如何使用 Topshelf 組件快速創建Windows服務,接下來介紹如何使用 Quartz.net 關於Quartz.net的好處,網上搜索都是一大把一大把的,我就不再多介紹。 先介紹需要用到的插件: Quartz版本我用的 2.6.2的, 沒有用3.0以上的,因為你用了就會知道,會列印 ...
  • static void GetNetVersionDemo() { using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@... ...
  • 畢業一年半了,從net framework過渡到net core,感覺擴開了自己的眼界,聽說了docker、微服務、CI/CD等等技術。也跟著學了一些,感覺對技術的世界還是充滿了興趣。也有過一絲迷茫,看到那麼多新穎的技術卻無從下手。所以有想法開始嘗試寫博客,記錄自己的點滴和學習記錄吧。 在這工作的一 ...
  • 之前實現的那版依賴註入框架基本可用,但是感覺還是不夠靈活,而且註冊服務和解析服務在同一個地方感覺有點彆扭,有點職責分離不夠。於是借鑒 Autofac 的做法,增加了一個 `ServiceContainerBuilder` 來負責註冊服務,`ServiceContainer`負責解析服務,並且增加了一... ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...