首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET SignalR 實現即時訊息推送:原理、環境建置與 Demo 實作

     編輯:關於ASP.NET

ASP.NET SignalR 實現即時訊息推送:原理、環境建置與 Demo 實作

ASP.NET SignalR 是 ASP.NET 生態系中實現伺服器向用戶端即時推送的核心類庫,支援 WebSocket、Server-Sent Events、Long Polling 等多種傳輸機制,自動協商最佳連線方式。

運行環境需求

  • .NET Framework 4.5+
  • ASP.NET MVC 3+ 或 ASP.NET Core (SignalR Core)
  • NuGet 套件管理器

核心原理

SignalR 採用遠端代理模式,類似 WCF/Remoting,提供兩種主要程式設計介面:

介面特性適用場景
PersistentConnection低層級、長輪詢基礎、自訂協定特殊傳輸需求、二進制資料流
Hubs (高層 API)強型別、自動 JSON 序列化、RPC 風格、客戶端/伺服器雙向呼叫即時聊天、通知、儀表板、協同編輯

Hubs 工作流程:

  1. 用戶端建立連線,自動協商傳輸 (WebSocket 優先)。
  2. 伺服器端定義 Hub 類別繼承 Hub,包含公共方法。
  3. 用戶端透過自動生成的 JavaScript Proxy 呼叫伺服器 Hub 方法。
  4. 伺服器執行方法,可透過 Clients.All/Clients.Caller/Clients.Group 呼叫用戶端 JavaScript 函數。
  5. 雙向通訊皆使用 JSON 序列化資料。

Demo 建置步驟 (ASP.NET MVC 5 + SignalR 2.x)

1. 安裝套件


# Package Manager Console
Install-Package Microsoft.AspNet.SignalR

NuGet 安裝 SignalR

2. 建立 Hub 類別


using Microsoft.AspNet.SignalR;

public class ChatHub : Hub {
    public void Send(string name, string message) {
        // 廣播給所有連線用戶端
        Clients.All.addMessage(name, message);
    }
    
    public void JoinGroup(string groupName) {
        Groups.Add(Context.ConnectionId, groupName);
    }
}

3. 註冊路由 (Startup.cs 或 Global.asax)


// OWIN Startup (推薦)
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(MyApp.Startup))]
namespace MyApp {
    public class Startup {
        public void Configuration(IAppBuilder app) {
            app.MapSignalR(); // 預設路由 /signalr
        }
    }
}

4. 用戶端頁面 (Razor View)


@{
    ViewBag.Title = "SignalR Chat";
}
<script src="~/Scripts/jquery-3.6.0.min.js"></script>
<script src="~/Scripts/jquery.signalR-2.4.1.min.js"></script>
<script src="~/signalr/hubs"></script>  @* 動態生成的 Proxy *@

<div>
    <input type="text" id="name" placeholder="姓名" />
    <input type="text" id="message" placeholder="訊息" />
    <button id="send">發送</button>
</div>
<ul id="messages"></ul>

<script>
    $(function () {
        var chat = $.connection.chatHub; // 小駝峰命名
        chat.client.addMessage = function (name, message) {
            $('#messages').append('<li><strong>' + name + '</strong>: ' + message + '</li>');
        };
        $.connection.hub.start().done(function () {
            $('#send').click(function () {
                chat.server.send($('#name').val(), $('#message').val());
                $('#message').val('').focus();
            });
        });
    });
</script>

進階主題

  • 擴展性:使用 Redis、SQL Server、Azure SignalR Service 做訊息後端,支援多伺服器叢集。
  • 認證授權:[Authorize] 屬性保護 Hub 方法,Context.User 取得當前使用者。
  • 群組管理:Groups.Add/Remove 實現聊天室、頻道訂閱。
  • 連線生命週期:覆寫 OnConnected/OnDisconnected/OnReconnected 處理上下線邏輯。
  • 效能監控:IPerformanceCounter、自訂計數器監控連線數、訊息吞吐量。

ASP.NET Core SignalR 差異

  • 套件:Microsoft.AspNetCore.SignalR
  • 內建於 ASP.NET Core 中介軟體管線,app.MapHub<ChatHub>("/chatHub")
  • 用戶端庫:@microsoft/signalr (npm),TypeScript 優先、無 jQuery 相依。
  • 效能更佳、跨平台、支援 gRPC 傳輸協定 (預覽)。

總結

SignalR 以 Hubs 高層 API、自動傳輸協商、JSON 雙向 RPC 大幅簡化即時通訊開發。配合 OWIN/ASP.NET Core 中介軟體管線、Redis/Azure 後端擴展,可構建支援百萬級並發連線的即時應用系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved