當前位置: 妍妍網 > 碼農

.NET Core SignalR:實作伺服器即時訊息推播

2024-06-06碼農

在現代Web套用中,即時通訊已經成為了一個不可或缺的功能。無論是聊天套用、線上協作工具,還是即時數據更新的儀表板,都需要一種機制來在伺服器和客戶端之間建立雙向通訊。.NET Core SignalR就是這樣一個強大的庫,它簡化了在.NET套用中添加即時Web功能的復雜性。

SignalR簡介

SignalR是一個ASP.NET庫,用於在Web應用程式中添加即時Web功能。它提供了一種簡單的方式來在伺服器和客戶端之間建立雙向通訊。透過使用WebSocket(如果可用),或者退回到其他技術(如Server-Sent Events、Forever Frame或長輪詢),SignalR確保了與各種客戶端的相容性。

.NET Core SignalR的特點

  1. 自動選擇最佳傳輸方式 :SignalR會根據客戶端和伺服器的支持情況,自動選擇最合適的通訊方式。

  2. 跨平台支持 :作為.NET Core的一部份,SignalR支持跨平台執行,包括Windows、Linux和macOS。

  3. 支持多種客戶端 :除了常見的Web瀏覽器外,SignalR還支持多種客戶端庫,包括JavaScript、.NET、Java等。

  4. 簡單的API :SignalR提供了簡潔明了的API,使得開發者能夠輕松地實作即時通訊功能。

  5. 整合身份驗證和授權 :SignalR可以與ASP.NET Core的身份驗證和授權系統整合,確保只有經過驗證和授權的使用者才能參與即時通訊。

實作伺服器即時訊息推播

下面是一個簡單的範例,演示如何使用.NET Core SignalR實作伺服器即時訊息推播。

1. 建立SignalR Hub

在ASP.NET Core計畫中,首先建立一個SignalR Hub類。Hub是處理伺服器和客戶端之間通訊的中心點。

using Microsoft.AspNetCore.SignalR;
public classChatHub : Hub
{
publicasync Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}

2. 配置SignalR

Startup.cs 中配置SignalR。

publicvoidConfigureServices(IServiceCollection services)
{
services.AddSignalR();
// 其他服務配置...
}
publicvoidConfigure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 其他中介軟體配置...
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chatHub");
// 其他路由配置...
});
}

3. 客戶端實作

在客戶端,你可以使用SignalR的JavaScript客戶端庫來連線Hub並接收訊息。

<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/5.0.10/signalr.min.js"></script>
<script>
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.configureLogging(signalR.LogLevel.Information)
.build();
connection.on("ReceiveMessage"function (user, message{
console.log(user + ": " + message);
});
connection.start().then(function () {
console.log("Connected!");
}).catch(function (err0r{
returnconsole.error(err0r.toString());
});
</script>

4. 發送訊息

當伺服器需要推播訊息時,可以透過註入 IHubContext<ChatHub> 來發送訊息。

public classSomeService
{
privatereadonly IHubContext<ChatHub> _hubContext;
publicSomeService(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}
publicasync Task SendNotificationAsync(string message)
{
await _hubContext.Clients.All.SendAsync("ReceiveMessage""System", message);
}
}

結論

.NET Core SignalR為開發者提供了一種強大而靈活的方式來添加即時通訊功能到他們的套用中。透過簡單的API和跨平台支持,SignalR使得實作伺服器即時訊息推播變得輕而易舉。無論是線上聊天、即時數據更新還是其他需要即時反饋的場景,SignalR都是一個值得考慮的解決方案。