当前位置: 首页 > news >正文

.Net Core MVC + Vue + SignalR 实现 后端数据主动推送到前端

1. 安装  Microsoft.AspNetCore.SignalR

2. 配置 SignalR 服务

public class RandomNumberHub : Hub
{/// <summary>/// 前端推送到后端/// </summary>public async Task SendEvent(string number){await Clients.All.SendAsync("ReceiveEvent", number);}
}public class RandomNumberService : BackgroundService
{private readonly IHubContext<RandomNumberHub> _hubContext;public RandomNumberService(IHubContext<RandomNumberHub> hubContext){_hubContext = hubContext;}/// <summary>/// 后端推送到前端/// </summary>protected override async Task ExecuteAsync(CancellationToken stoppingToken){var random = new Random();while (!stoppingToken.IsCancellationRequested){var randomNumber = random.Next(1, 100).ToString();await _hubContext.Clients.All.SendAsync("ReceiveEvent", randomNumber);await Task.Delay(5000, stoppingToken);}}
}

3. 前端界面

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>@ViewData["Title"]</title><script src="~/js/vue.global.js"></script><script src="~/js/signalr.min.js"></script><style>.chart-container {margin-top: 20px;padding: 20px;border: 1px solid #ccc;border-radius: 5px;max-width: 400px;}h3 { color: #333; }p { font-size: 16px; }</style>
</head>
<body><div id="app"><div class="chart-container"><button @@click="sendNumber">推送数据</button><h3>随机数显示</h3><p v-if="randomNumber">最新随机数: {{ randomNumber }}</p></div></div><script>const { createApp } = Vue;createApp({data() {return {randomNumber: null, // 存储随机数
                    connection: null // 存储 SignalR 连接
                };},methods: {initSignalR() {// 初始化 SignalR 连接
                    const connection = new signalR.HubConnectionBuilder().withUrl("/HubUrl").withAutomaticReconnect().build();// 监听 ReceiveRandomNumber 事件
                    connection.on("ReceiveEvent", (number) => {this.randomNumber = number;//alert(`接收到随机数: ${number}`); // 使用 alert 显示
                    });// 连接错误处理
                    connection.onclose((error) => {console.error("SignalR 连接断开: ", error);this.randomNumber = null;alert("SignalR 连接断开,正在尝试重连...");});// 启动连接
                    connection.start().then(() => console.log("SignalR Connected!")).catch(err => {console.error("SignalR Connection Error: ", err);alert("无法连接到 SignalR,请检查后端服务");});// 存储连接this.connection = connection;},sendNumber() {const number = Math.floor(Math.random() * 100).toString();this.connection.invoke("SendEvent", number).then(() => console.log("Number sent to server!")).catch(err => console.error("Error sending number: ", err));}},mounted() {this.initSignalR(); // 组件挂载时初始化 SignalR
            },beforeUnmount() {if (this.connection) {this.connection.stop(); // 组件销毁时断开 SignalR
                }}}).mount('#app');</script>
</body>
</html>

4. 配置Program启动项

   public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// Add services to the container.
       builder.Services.AddControllersWithViews();builder.Services.AddSignalR();builder.Services.AddHostedService<RandomNumberService>();builder.Services.AddCors(options =>{options.AddPolicy("AllowAll", builder =>{builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();});});var app = builder.Build();if (app.Environment.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseStaticFiles();app.UseRouting();app.UseCors("AllowAll");app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");endpoints.MapHub<RandomNumberHub>("/HubUrl");});// Configure the HTTP request pipeline.if (!app.Environment.IsDevelopment()){app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();app.UseRouting();app.UseAuthorization();//app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();}

完事:

image

 

http://www.jsqmd.com/news/6489/

相关文章:

  • js 获取下一个月时间和下一年的时间
  • 【Rust GUI开发入门】编写一个本地音乐播放器(5. 制作音乐列表组件) - Jordan
  • 【Nordic】nRF9151的SLM例程常用AT指令说明
  • sql server经典语句「转」
  • Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]
  • 2025 年最新推荐软件开发机构榜:聚焦微服务架构与 724 小时服务的优质厂商精选指南人力资源管理系统/资产管理系统/数据中台管理系统/流程管理系统软件开发公司推荐
  • 【半导体物理 | 学习笔记】第一章 半导体中的电子状态
  • 计数(5):多项式相关
  • 最新WTAPI开发微信机器人教程说明
  • 线性DP - 学习笔记
  • 2025 年最新制氮机厂家权威推荐排行榜:聚焦行业优质厂商综合实力,助力企业精准选购优质设备制氮机产生氮气/氮气纯化/设备改造/维修/保养/半导体用制氮机厂家推荐
  • idea打包推送maven仓库及同时推送到不同的maven仓库,本地和云上的腾讯云
  • 2025 年除湿机厂家最新权威推荐排行榜:实力厂家技术口碑评测及场景适配选购指南吊顶/泳池/车库/防爆/调温/新风除湿机厂家推荐
  • 2025 年液氨蒸发器厂家联系方式,众众电热:多领域加热设备供应与定制化解决方案提供商
  • debian11不进入桌面环境打开chromiu
  • 【Batch】批量修改文件后缀
  • 【solace】基于docker部署solace环境
  • 2025 年阿里巴巴开通实力商家店铺开通代运营 / 阿里巴巴新手开店全托管代运营公司推荐:南鑫粤网络 —— 全域运营解决方案与实战服务优势解析
  • Vue-element-admin开发指南 - 教程
  • 2025 年国内工作服厂家最新推荐排行榜:聚焦工艺设计与服务,精选权威榜单助企业采购冬季/春季/工人/车间/防静电/餐饮/劳保工作服厂家推荐
  • ClickHouse 窗口函数使用详解(一) - 若
  • 在 Vue 3 的 script setup 语法中,定义组件名称(name)
  • 2025 年杀虫公司联系方式推荐 天津万康:靶向消杀 + 1 年质保 300 + 政企认可的虫害防控专家
  • 2025 年最新 1688 代运营公司推荐榜单:助力企业突破电商困境,精选优质服务商阿里巴巴国际站代运营/新店起量代运营/数据分析代运营/爆款打造代运营公司推荐
  • ClickHouse 窗口函数详解:告别 GROUP BY 的局限性,实现灵活数据分析 - 若
  • 简单WEB网站
  • 2025 年窗帘杆源头厂家最新推荐榜单:包含支架 / 环 / 全自动 / 可伸缩等多类产品及配件,帮助选到品质与交期双优的优质厂家
  • 2025 年电动窗帘厂家推荐榜单:聚焦国内优质企业定制实力与口碑,为采购者提供最新选择参考电动窗帘系统/电机/轨道/配件/智能电动窗帘厂家推荐
  • Vue3 使用注意事项
  • ClickHouse ReplacingMergeTree 去重陷阱:为什么你的 FINAL 查询无效? - 若