视觉上位机向上提供 API 并驱动 Web 看板,核心是 **“用 ASP.NET Core Minimal API 做数据出口,用 SignalR 做实时推送”**

发布时间:2026/10/18 15:13:21

视觉上位机向上提供 API 并驱动 Web 看板,核心是 **“用 ASP.NET Core Minimal API 做数据出口,用 SignalR 做实时推送”** 视觉上位机向上提供 API 并驱动 Web 看板核心是“用 ASP.NET Core Minimal API 做数据出口用 SignalR 做实时推送”。API 负责接收视觉结果和提供历史查询SignalR 负责把新结果即时“推”到所有打开看板的浏览器无需前端轮询。后端用 Minimal API 暴露视觉数据Minimal API 把路由和处理逻辑直接写在Program.cs里代码量极少适合视觉上位机这种“专注数据收发”的场景。1. 定义数据模型publicrecordInspectionRecord(stringSn,stringStation,boolIsOk,doubleX,doubleY,doubleAngle,DateTimeTimestamp);2. 创建 API 端点varbuilderWebApplication.CreateBuilder(args);// 注册 SignalRbuilder.Services.AddSignalR();varappbuilder.Build();// 内存存储生产环境应换数据库varrecordsnewListInspectionRecord();// 视觉上位机调用此接口上报结果app.MapPost(/api/inspection,async(InspectionRecordrecord,IHubContextDashboardHubhub){records.Add(record);// 关键立即通过 SignalR 推送给所有看板客户端awaithub.Clients.All.SendAsync(ReceiveInspection,record);returnResults.Ok();});// 看板首次加载时拉取近期记录app.MapGet(/api/inspection/recent,(intcount50)Results.Ok(records.TakeLast(count)));// 看板统计app.MapGet(/api/stats,(){vartodayrecords.Where(rr.Timestamp.DateDateTime.Today).ToList();returnResults.Ok(new{Totaltoday.Count,OkCounttoday.Count(rr.IsOk),NgCounttoday.Count(r!r.IsOk),Yieldtoday.Count0?(double)today.Count(rr.IsOk)/today.Count*100:0});});app.MapHubDashboardHub(/dashboardHub);app.Run();MapPost接收 JSON 请求体参数自动绑定到InspectionRecord对象。MapGet返回Results.Ok()包装的 JSON前端可直接解析。SignalR Hub实时推送的引擎SignalR 使用 WebSocket 在服务器和浏览器之间建立持久连接服务器可以在有新数据时主动推送而不是等浏览器来问。publicclassDashboardHub:Hub{// 看板连接时可加入特定分组如按车间publicoverrideasyncTaskOnConnectedAsync(){awaitGroups.AddToGroupAsync(Context.ConnectionId,AllViewers);awaitbase.OnConnectedAsync();}}Hub 本身几乎不需要业务逻辑——视觉结果是通过IHubContextDashboardHub从 API 端点推送的。这样 API 和 Hub 解耦API 处理数据Hub 只管推送。前端看板极简的实时刷新一个纯 HTML JavaScript 的看板页面无需框架!DOCTYPEhtmlhtmlheadtitle生产看板/titlescriptsrchttps://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.0/signalr.min.js/script/headbodyh1实时生产看板/h1dividstats/divtableidrecordstrthSN/thth站点/thth结果/thth时间/th/tr/tablescript// 1. 首次加载拉取历史数据fetch(/api/inspection/recent?count20).then(rr.json()).then(datadata.forEach(addRow));// 2. 建立 SignalR 连接constconnectionnewsignalR.HubConnectionBuilder().withUrl(/dashboardHub).withAutomaticReconnect()// 断线自动重连.build();// 3. 监听服务端推送connection.on(ReceiveInspection,(record){addRow(record);updateStats();// 重新拉取统计});connection.start().then(()console.log(已连接));functionaddRow(r){consttabledocument.getElementById(records);constrowtable.insertRow(1);row.innerHTMLtd${r.sn}/tdtd${r.station}/td td stylecolor:${r.isOk?green:red}${r.isOk?OK:NG}/td td${newDate(r.timestamp).toLocaleTimeString()}/td;// 保留最新 20 条while(table.rows.length21)table.deleteRow(21);}functionupdateStats(){fetch(/api/stats).then(rr.json()).then(s{document.getElementById(stats).innerHTML总数:${s.total}| OK:${s.okCount}| NG:${s.ngCount}| 良率:${s.yield.toFixed(1)}%;});}/script/body/htmlwithAutomaticReconnect()是生产环境的关键——网络抖动时 SignalR 会自动重连看板无需人工刷新。数据流全景视觉上位机 API 服务器 浏览器看板 │ │ │ │── POST /api/inspection ──►│ │ │ │── 存入内存/数据库 │ │ │── SignalR 推送 ──────────►│── 表格追加一行 │ │ │── 刷新统计 │ │ │ │◄── 若需查询历史 ──────────│◄── GET /api/inspection ────│首次加载API 端点的IHubContext注入让“处理请求”和“推送消息”在同一个 HTTP 请求中完成视觉上位机发完 POST 就返回浏览器几乎同时收到更新。这种模式比浏览器每秒轮询/api/inspection/recent要高效得多尤其在看板数量多的时候。实操建议看板页面直接托管在同一个 ASP.NET Core 项目中。把index.html放到wwwroot/下用app.UseStaticFiles()开启静态文件服务浏览器访问http://服务器IP:5000/index.html即可无需额外部署前端服务器。生产环境把内存List换成数据库。用 EF Core 存入 SQLite 或 SQL Server/api/stats的统计逻辑直接走 SQL 聚合避免每次请求都遍历内存列表。连接状态要可见。在看板页面显示“已连接/重连中”状态当 SignalR 断开时用户能立即感知而不是看着静止的页面以为产线停了。
延伸阅读

更多相关文章

2026/10/18 15:08:21

核心语法——面向对象基础

一 概述二 类与对象类的定义1 动态添加属性2 定义类时指定实例属性__init__方法是初始化的方法,会在对象创建时自动调用,可以在该方法中为对象设置对应的属性self:是第一个参数,表示当前所创建出来的实例对象同一个类构建的对象,属…

2026/10/18 15:08:21

支付宝账单前端钩子:DOM捕获原理与合规对账实践

简介:本资源是一个面向Android安全与逆向开发者的Hook技术实践项目,聚焦支付宝客户端(v10.1.38.2139)的账单列表、账单详情及收款二维码三类核心功能的动态钩子实现,适用于具备Java/Smali基础、熟悉Xposed或Frida框架的…

2026/10/18 16:23:27

AI直播系统对接Vimeo全解析:自研架构、踩坑实录与工程实践

最近一个做视频云服务的朋友跟我聊起他们怎么拿到海外平台认可的,聊着聊着就说到Vimeo的官方推荐列表。这让我想起手头正在做的"悦目世界AI直播系统",作为一套完全自研的智能直播解决方案,从立项到拿到Vimeo认可,中间踩…

2026/10/18 16:23:27

Kafka分区与副本机制:从路由规则到生产端参数的全链路解析

Kafka 的消息模型里,生产者和分区的关系,以及副本之间的配合,几乎是所有刚接触 Kafka 的人最先遇到的两道坎。标题这两个词看着像两个独立的知识点,但实际上它们是连在一起的:消息写入哪个分区,决定了消息被…

2026/10/18 16:23:27

React Native混合开发:Android原生与RN双向通信与传参实战

做React Native混合开发,Android原生和React Native相互调用和传参是最绕不开的主线。我最早在混合应用上折腾时,原生侧负责扫码、蓝牙打印和定位,RN侧负责业务页面。两端不仅要互相触发对方的方法,还得把结果来回携带&#xff0c…

2026/10/18 16:23:27

本地AI部署实战:Ollama拉起开源模型,OpenClaw接入业务流程

2026 年还在纠结“本地 AI 到底值不值得部署”的人,我猜多半没经历过月底被云端 API 账单支配的恐惧,也没被敏感数据不能出内网的需求折磨过。我在帮不同团队搭本地模型服务时,被问得最多的两个问题分别是:Ollama 这类工具是不是只…

2026/10/18 16:18:27

LangChain模型配置实战:从参数调优到云端本地切换全攻略

聊到 LangChain,我自己的体感是:跑通一个简单 Chain 很容易,真正让人卡住的反而是平时不太注意的模型配置。很多人拉着 PromptTemplate 调了半天,发现问题根本不在 Prompt,而是你代码里那个llm对象没有配对。模型才真正…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑