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

news/2025/9/30 17:13:32/文章来源:https://www.cnblogs.com/HansZimmer/p/19121477

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.mzph.cn/news/923090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 布袋包装厂家最新推荐榜:自贸区实力厂商领衔,含手提袋/帆布袋/无纺布袋,年销 500 万级生产商精选

在 “双碳” 目标与 “限塑令” 深化实施的双重推动下,布袋包装市场需求年增速超 20%,但行业乱象始终制约采购决策效率。据调研,67% 的企业曾遭遇样品与成品不符、交货延期等问题,原材料掺假、定制能力不足、环保资…

做网站用的图片分辨率光谷软件园 网站建设

想要生活在幸福的职场中&#xff0c;并非无技巧可寻。以下9个小技巧&#xff0c;帮你收获职场幸福。第1招&#xff1a;按部就班地行动 事业成功的人往往耐得住寂寞&#xff0c;在那些看似程式化的进程当中寻找到快乐&#xff0c;他们是善于自我控制的人&#xff0c;可以让时间听…

做网站用什么配置的笔记本专业做家电经销的网站

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面&#xff1a;有关傅里叶变换的解释太多了&#xff0c;这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

本地广东中山网站建设wordpress眉顶布局

1.遇到问题 公司项目是基于ruoyi 框架快速搭建开发&#xff0c;使用多线程搜索查询&#xff0c;所以以用户区分任务&#xff0c;保证可以搜索任务和取消搜索&#xff0c;所以我这需要获得用户id&#xff0c;使用 SecurityUtils 共工工具类从请求头获取token&#xff0c;然后解…

seo网站优化知识网站如何进行优化设计

文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp…

可以做长页的网站怎么更改网站域名

图像分类是模式识别重要研究领域之一&#xff0c;它的任务是把目标样本分成不同类别&#xff0c;赋予样本相应类别标签。分类实现的基础是用传感器检测到样本的特征&#xff0c;比如形状、颜色、纹理等基本特征或通过基本特征提取更为复杂的特征信息&#xff0c;其中纹理是表示…

一个人做公司管理网站一灯wordpress主题

随着社交媒体的不断发展和智能手机的普及&#xff0c;微信已经成为我们日常生活中不可或缺的一部分。作为一个商家或者个人品牌&#xff0c;利用微信进行群发消息是一种非常便捷和高效的方式来推广产品或者传递信息。 然而&#xff0c;传统的微信群发功能却有着一些限制&#…

怎么建设一个淘宝客网站制作网站用什么软件好

背景 随着互联网的高速发展&#xff0c;信息安全问题已经成为企业最为关注的焦点之一&#xff0c;而前端又是引发企业安全问题的高危据点。在移动互联网时代&#xff0c;前端人员除了传统的 XSS、CSRF 等安全问题之外&#xff0c;又时常遭遇网络劫持、非法调用 Hybrid API 等新…

手机网站外链巢湖网站设计

屏幕锁&#xff0c;就是锁住屏幕不让用户误触摸&#xff0c;从开发者的角度看就是不响应用户的点击事件。 屏幕锁界面 可以自己创建一个布局文件&#xff0c;或者直接创建一个View&#xff08;例如ImageView&#xff09;。 参数LayoutParams mLayoutParams new LayoutParam…

公司做网站比较好的青海旅游的网站建设

java中有7个位运算&#xff08;&、|、^、~、>>、<<和>>>&#xff09; 第一组 分别是按位与&、按位或|、按位异或^&#xff0c;按位取反~&#xff0c;它们的运算规则是&#xff1a; 按位与& : 两位全为1&#xff0c;结果为1&#xff0c;否则…

浙江网站建设设计wordpress菜单添加链接

WPF布局原则 不应显式设置大小 为了布局的稳定性&#xff0c;控件的大小应该可以自动适应容器。如下为新建一个窗体&#xff0c;默认包含一个Grid容器&#xff0c;该控件没有显式设置宽高&#xff0c;所以&#xff0c;在改变窗体大小的时候&#xff0c;该容器的大小也随着变化…

网站建设管理招聘贵阳专业网站建设公司哪家好

CSS 3D变换是Web开发中一项强大的技术&#xff0c;它允许开发者在网页上创建和展示三维图形和动画。以下是关于CSS 3D变换的深入浅出介绍&#xff1a; 一、3D变换基础 坐标轴&#xff1a; X轴&#xff1a;水平向右&#xff0c;正方向为右&#xff0c;负方向为左。Y轴&#xff…

做co网站重庆妇科医院咨询

Go语言学习笔记&#xff1a;GORM 介绍及快速入门&#xff0c;简单查询 前言 GORM 是一个用 GoLang 语言编写的 ORM&#xff08;对象关系映射&#xff09;库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD&#xff08;创建、读…

文登网站建设南京做网站南京乐识专心

市面上读取 ini 的包都是 读取整个文件到内存中,再获取和修改值, 最后自己再调用保存文件, 这种方式在读取大文件的时候 非常的不友好. windows api 中有现成的高效方法 安装 jna-platform (里面封装了各个系统的 api ,直接用就行. 不用再手动写固定的函数定义) jna-platfor…

做视频网站程序多少钱企业宣传片视频模板

在Vue.js中&#xff0c;$nextTick是一个用于延迟执行一段代码的实例方法。它的作用是在DOM更新后立即执行回调函数&#xff0c;确保在DOM更新完成后再进行操作。以下是其具体用法&#xff1a; 使用场景&#xff1a;当需要在数据变化后立即对DOM进行操作时&#xff0c;可以使用…

开一个二手车销售网站怎么做贵阳网站seo

1、参数化 1&#xff09;、准备参数化文件 2&#xff09;&#xff0c;添加CSV数据文件设置 3&#xff09;、在请求里 引用参数 2、关联函数 1&#xff09;、给学生充值金币需要从登录返回获取登录cookie 在登录接口添加后置处理器JSON Extractor 用户登录返回结果为&#xff1…

移动端网站制作的有哪些要求网页版原神

爱丽丝和鲍勃一起玩游戏&#xff0c;他们轮流行动。爱丽丝先手开局。 最初&#xff0c;黑板上有一个数字 N 。在每个玩家的回合&#xff0c;玩家需要执行以下操作&#xff1a; 选出任一 x&#xff0c;满足 0 < x < N 且 N % x 0 。 用 N - x 替换黑板上的数字 N 。 如…

js 获取下一个月时间和下一年的时间

// d 实例 :2025-09-01 getNextMonthDate(d) { let t = d.split("-"); console.log(t) let year = parseInt(t[0]); let month = parseInt(t[1]); let day = t[2]; if (month === 1 && (da…

【Rust GUI开发入门】编写一个本地音乐播放器(5. 制作音乐列表组件) - Jordan

目的是要做一个这样的音乐列表组件:包含:一个标题栏 多个列表项制作标题栏 需要在标题栏上显示排序图标,实现点击排序功能,因此额外需要定义一个枚举类型SortKey指示排序依据。这里的排序图标也手动绘制,不使用网…

实用指南:分布式调度问题:定时任务

实用指南:分布式调度问题:定时任务2025-09-30 16:25 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…