使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知

示例代码:https://download.csdn.net/download/hefeng_aspnet/90448094

介绍

构建实时应用程序已成为现代 Web 开发中必不可少的部分,尤其是对于通知、聊天系统和实时更新等功能。SignalR 是 ASP.NET 的一个强大库,可实现服务器端代码和客户端 Web 应用程序之间的无缝实时通信。在本指南中,我们将介绍如何使用最少 API 和 SignalR 在 .NET Core 8 中创建实时通知,确保您的应用程序保持响应速度快且引人入胜。

为什么使用 SignalR?

1、实时通信:它支持实时更新,这对于聊天系统、游戏、现场体育更新和协作应用程序等现代动态应用程序至关重要。

2、简化开发: SignalR提供了一个简单的API,抽象了实时通信的复杂性,使开发人员更容易实现这些功能。

3、跨平台: SignalR 支持多个平台,包括 .NET、JavaScript 和 Xamarin,允许在不同类型的应用程序中广泛适用。

4、自动重连: SignalR 在连接断开时处理自动重连,确保实时通信的可靠性。

5、可扩展性: SignalR 具有可扩展性,可以与其他服务(如 Azure SignalR 服务)结合使用,后者可以处理扩展需求并提供高可用性。

创建 SignalR 服务器

安装

首先,让我们安装 SignalR 包。您可以使用以下命令通过 Visual Studio 中的 NuGet 包管理器控制台执行此操作:

Install-Package Microsoft.AspNetCore.SignalR

或者,您可以使用 NuGet 包管理器 UI 通过搜索"Microsoft.AspNetCore.SignalR"来安装它。

创建 ASP.Net Core Web API 项目

步骤 1

打开 Visual Studio 并单击"创建新项目"。

第 2 步

选择 ASP.NET Core Web API 模板,如下图所示,然后单击下一步按钮。

步骤3

通过指定项目名称和要保存项目的位置来配置您的项目。

步骤4

选择您想要使用的.Net Core 框架版本,然后单击创建按钮。

步骤5

转到 Program.cs 并为 SignalR 添加服务

builder.Services.AddSignalR();

步骤6

添加类 StockHub.cs

using Microsoft.AspNetCore.SignalR;

namespace SignalRWebAPI

{

public class StockHub:Hub

{

public async Task SendStockPrice(string stockName, decimal price)

{

await Clients.All.SendAsync("ReceiveStockPrice", stockName, price);

}

public override async Task OnConnectedAsync()

{

string connectionId = Context.ConnectionId;

await base.OnConnectedAsync();

}

}

}

步骤7

转到 Program.cs 并映射 stockHub

app.MapHub<StockHub>("/hubs/stock");

步骤8

后台服务持续推送通知,添加类 Worker.cs

using Microsoft.AspNetCore.SignalR;

namespace SignalRWebAPI

{

public class Worker : BackgroundService

{

private readonly ILogger<Worker> _logger;

private readonly IHubContext<StockHub> _stockHub;

private const string stockName = "Basic Stock Name";

private decimal stockPrice = 100;

public Worker(ILogger<Worker> logger, IHubContext<StockHub> stockHub)

{

_logger = logger;

_stockHub = stockHub;

}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)

{

while (!stoppingToken.IsCancellationRequested)

{

try

{

_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

Random rnd = new Random();

decimal stockRaise = rnd.Next(1, 10000);

//List of stock names

string[] stockNames = { "Apple", "Microsoft", "Google", "Amazon", "Facebook" };

//Random stock name

var stockName = stockNames[rnd.Next(0, stockNames.Length)];

//Send Notification

await _stockHub.Clients.All.SendAsync("ReceiveStockPrice", stockName, stockRaise);

_logger.LogInformation("Sent stock price: {stockName} - {stockRaise}", stockName, stockRaise);

await Task.Delay(4000, stoppingToken);

}

catch (Exception ex)

{

_logger.LogError(ex, "Error sending stock price");

}

}

}

}

}

在 Program.cs 中添加此后台服务

builder.Services.AddHostedService<Worker>();

SignalR 接收器

服务器端

单独添加新的控制台项目或在同一个解决方案文件中添加。

从控制台应用程序的 Program.cs 中删除所有代码并粘贴以下代码。

using Microsoft.AspNetCore.SignalR.Client;

//here is SignalR Sender URL

string hubUrl = "https://localhost:7091/hubs/stock";

var hubConnection = new HubConnectionBuilder()

.WithUrl(hubUrl)

.Build();

// Register a handler for messages from the SignalR hub

// "ReceiveStockPrice" is the topic to which SignalR sending the singnals

hubConnection.On<string, decimal>("ReceiveStockPrice", (stockName, stockPrice) =>

{

Console.WriteLine($"Message received--> Stock Name: {stockName} Stock Price: {stockPrice}");

});

try

{

// Start the connection

hubConnection.StartAsync().Wait();

Console.WriteLine("SignalR connection started.");

}

catch (Exception ex)

{

Console.WriteLine($"Error connecting to SignalR: {ex.Message}");

throw;

}

//Create a cancellation token to stop the connection

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

//hubConnection.StopAsync().Wait();

var cancellationToken = cancellationTokenSource.Token;

// Handle Ctrl+C to gracefully shut down the application

Console.CancelKeyPress += (sender, a) =>

{

a.Cancel = true;

Console.WriteLine("Stopping SignalR connection...");

cancellationTokenSource.Cancel();

};

try

{

// Keep the application running until it is cancelled

await Task.Delay(Timeout.Infinite, cancellationToken);

}

catch (TaskCanceledException)

{

}

// Stop the connection gracefully

await hubConnection.StopAsync();

Console.WriteLine("SignalR connection closed.");

客户端

Index.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>SignalR Client</title>

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.18/signalr.min.js"></script>

</head>

<body>

<h1>Stock Prices</h1>

<div id="stockPrices"></div>

<script>

const connection = new signalR.HubConnectionBuilder()

.withUrl("https://localhost:7091/hubs/stock")

.build();

connection.on("ReceiveStockPrice", (stockName, stockPrice) => {

const stockPricesDiv = document.getElementById("stockPrices");

const newPrice = document.createElement("div");

newPrice.textContent = `Stock received: {stockName} - {stockPrice}`;

stockPricesDiv.appendChild(newPrice);

});

connection.start()

.then(() => {

console.log("SignalR connection started.");

})

.catch(err => {

console.error("Error connecting to SignalR: ", err);

});

window.addEventListener("beforeunload", () => {

connection.stop().then(() => {

console.log("SignalR connection stopped.");

}).catch(err => {

console.error("Error stopping SignalR connection: ", err);

});

});

</script>

</body>

</html>

现在可在 Web 和控制台应用程序上接收通知。

实现实时通知端点

app.MapPost("sendStockNotification", async (

string stockName,

decimal price,

IHubContext<StockHub> context) =>

{

await context.Clients.All.SendAsync("ReceiveStockPrice", stockName, price);

});

当客户端向端点发送包含股票名称和价格的 POST 请求时sendStockNotification,此代码将实时向所有连接的客户端广播股票价格更新。客户端将通过"ReceiveStockPrice"其订阅的方法接收此更新。

示例代码:https://download.csdn.net/download/hefeng_aspnet/90448094

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
csdn_aspnet1 个月前
在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性
signalr·.net8
Broadm2 个月前
C# - 获取枚举描述 - 使用增量源生成器
.net8·源代码生成·source generator·增量源生成器
lixww.cn3 个月前
ASP.NET Core SignalR向部分客户端发消息
javascript·websocket·vue·asp.net core·signalr
lixww.cn3 个月前
ASP.NET Core SignalR的协议协商
asp.net core·signalr
lixww.cn3 个月前
ASP.NET Core SignalR的分布式部署
redis·消息队列·asp.net core·signalr
鱼是一只鱼啊4 个月前
.netframeworke4.6.2升级.net8问题处理
开发语言·.net·.net8
三天不学习5 个月前
ASP.NET Core SignalR 双工通信
后端·asp.net·signalr·websockets·双工通信
敲厉害的燕宝8 个月前
SignalR——聊天室实践
前端·javascript·html·signalr
lee5769 个月前
.net 8.0 下 Blazor 通过 SignalR 与 Winform 交互
blazor·signalr