使用 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_aspnet12 天前
使用 .NET Core 7 SignalR 构建实时聊天应用程序
signalr·.net7
csdn_aspnet12 天前
.NET 9.0 SignalR 支持修剪和原生 AOT
aot·signalr·.net9
csdn_aspnet17 天前
.NetCore 8 反射与源生成器(Reflection vs Source Generators)
.net8
包达叔23 天前
Admin.Net中的消息通信SignalR解释
signalr
csdn_aspnet3 个月前
在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性
signalr·.net8
Broadm3 个月前
C# - 获取枚举描述 - 使用增量源生成器
.net8·源代码生成·source generator·增量源生成器
lixww.cn5 个月前
ASP.NET Core SignalR向部分客户端发消息
javascript·websocket·vue·asp.net core·signalr
lixww.cn5 个月前
ASP.NET Core SignalR的协议协商
asp.net core·signalr
lixww.cn5 个月前
ASP.NET Core SignalR的分布式部署
redis·消息队列·asp.net core·signalr