ASP.NET Core SignalR推送服务器日志

产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API。由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动。经过改造,除了保留业务逻辑代码,其他的基本重写。如今上位机的启动时间在网络状态良好的条件下可以秒启动。原上位机启动慢的原因:

1、启动时使用同步方式访问 Web API,在网络较弱时需要等待很长时间。改为导步请求,并且不等待请求结果,直接显示窗口;如果前面的请求失败,在窗口显示后再次发出异步请求,并且不等待。如果再失败才提示用户。

2、原项目在 Main 方式处就连接PLC,而产线的PLC压根就没插电源。我改为在连接机器人之后才连接,同样是异步不等待。如果连不上直接忽略。

3、原项目是一个窗口一个项目,然后把这些窗口生成 .dll,放到一个目录下,主程序启动时从目录下扫描 .dll,通过反射动态实例化窗口。这根本不需要的,一个上位机不可能有几百个窗口吧,何必呢。我改为使用服务容器的方式管理窗口,主界面通过依赖注入自动获取子窗口列表,再添加到主界面上。每个子窗口实现 IPage 接口用于识别,接口里面定义标题和页面索引即可。

4、干掉 Log4Net,使用官方的 Logging 库。

5、通信用的 JSON 数据全改用 System.Text.Json,而不是某 Newton,修改后速度快了一个次元。

由于 Web API 程序是运行在服务器的 IIS 中的,上一位开发者没有实现日志功能(仅仅用 ASP.NET Core 应用程序默认开启的控制台等日志功能),问题是日志没有保存。

原来的计划是把日志写到系统中,这样就能保存下来,用“事件查看器”就能欣赏。后来想想这方案不行,工厂那伙人肯定找不到日志在哪。写数据库里面?想想似乎没这个必要。简单粗暴,直接自定义一个 ILogger,把日志输出到文件中,然后加一个 Web API 读取文件,上位机那里就可以调用,返回日志内容。

后经过现场调试发现,其实也不需要这样。时间长了,会存下很多日志文件,就算用日期标识文件名也是很乱。实际上他们并不要求保存日志,只是在运作过程中实时监控机器人(应该叫机械臂)的工作状态而已。如果不出问题,他们甚至连日志都不看。上面用文件实现的日志方式,主要缺点是不能实时推到上位机。 现场调试也方便。

于是,另一方案:用 SignalR 实时向上位机推送日志。

 上面都是大话,现在开始主题。

原理是这样的:上位机作为 SignalR 客户端,发起连接后,不用主动调用服务器上的方法,而是等服务器调用回调方法。

 第一步,咱们要自定义一个 ILogger。

public class KingkingLogger : ILogger
{private readonly string cateName;public KingkingLogger(string cate){cateName = cate;}public IDisposable? BeginScope<TState>(TState state) where TState : notnull{return default;}public bool IsEnabled(LogLevel logLevel){return logLevel != LogLevel.None;}public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter){if(IsEnabled(l

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590596.shtml

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

相关文章

Avalonia 跨ViewModel访问数据或方法

在Avalonia应用程序中&#xff0c;跨ViewModel访问数据或方法通常是为了实现不同视图间的数据共享和通信。在MVVM设计模式下&#xff0c;这可以通过多种方式进行&#xff1a; 依赖注入&#xff08;DI&#xff09;&#xff1a; 通过IoC容器&#xff08;如Autofac、DryIoc等&…

工作八年经验总结

今年没怎么写博客了&#xff0c;2023年一共才发了5篇&#xff0c;在CSDN的排名也是名落孙山&#xff08;从最辉煌时的几百名落到了180w&#xff09;&#xff0c;在纠结要不要断更&#xff0c;算了&#xff0c;今年我还是在矫情下吧。。。。 【工作篇】 1、2023挑战与机遇并存…

cargo设置国内源 windows+linux

cargo默认的源比pip的源好多了&#xff0c;但是有时候速度还是很慢 一、部分国内源&#xff08;排名不分先后&#xff09; 这些源的格式用在具体的配置文件中 中国科学技术大学 [source.crates-io] replace-with ustc[source.ustc] registry "git://mirrors.ustc.ed…

Redis Cluster集群模式学习

Redis Cluster集群模式 Redis哨兵模式&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/133956200 Redis Cluster集群模式示意图&#xff1a; Cluster模式是Redis3.0开始推出采用无中心结构&#xff0c;每个节点保存数据和整个集群状态&#xff0c;每个节点都…

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址&#xff1a; github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍&#xff1a; 眼睛注视&#xff08;eye gaze&#xff09; 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外&#xff0c;它还被用…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

本文主要介绍回调函数的使用&#xff0c;包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;C/C精进之路 &…

再见2023,你好2024!

大家好&#xff0c;我是老三&#xff0c;本来今天晚上打算出去转一转&#xff0c;陆家嘴打车实在太艰难了&#xff0c;一公里多的路&#xff0c;司机走了四十分钟&#xff0c;还没到&#xff0c;再加上身体不适&#xff0c;咳嗽地比较厉害&#xff0c;所以还是宅在酒店里&#…

不同开源协议之间的差异分析

在IT行业中&#xff0c;开源协议是用来定义如何使用、修改、分享和分发软件的法律条款。不同的开源协议在保留版权、允许的使用方式、对衍生作品的要求以及对分发的限制等方面有所不同。以下是一些常用的开源协议及其主要特点&#xff1a; 1. MIT License (MIT) 特点&#xf…

用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境

之前给大家介绍了主机安装方式——如何在 Ubuntu 操作系统下安装部署 AI 环境&#xff0c;但随着容器化技术的普及&#xff0c;越来越多的程序以容器的形式进行部署&#xff0c;通过容器的方式不仅可以简化部署流程&#xff0c;还可以随时切换不同的环境。 实际上很多云服务厂…

Java ArrayList在遍历时删除元素

文章目录 1. Arrays.asList()获取到的ArrayList只能遍历&#xff0c;不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…

SpringBoot之YAML文件的使用

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringBoot之YAML文件的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、YAML配置…

vue的file-saver

Vue FileSaver 是一个用于在浏览器中保存文件的 Vue.js 插件。它提供了一种简单的方式来将数据以文件的形式下载到用户的计算机上。 使用 Vue FileSaver&#xff0c;你可以将数据保存为常见的文件格式&#xff0c;如文本文件&#xff08;.txt&#xff09;、CSV 文件&#xff0…

产业互联网,并不存在严格意义上的互联网

产业互联网里的「互联网」字眼&#xff0c;让人们想当然地认为&#xff0c;其与互联网之间有着很多的联系&#xff0c;甚至很多人干脆就将产业互联网当成了一个互联网的衍生品&#xff0c;最终&#xff0c;再度将产业互联网带入到了互联网的怪圈之中。 事实上&#xff0c;真正…

Java中的自定义异常处理:业务异常类的创建与使用

文章内容 引言 在Java编程中&#xff0c;异常处理是一项重要的技术&#xff0c;它允许程序在遇到错误或特殊情况时能够优雅地处理&#xff0c;而不是直接崩溃。Java提供了丰富的内置异常类&#xff0c;但在实际业务开发中&#xff0c;我们往往需要根据具体的业务需求定义自己的…

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是&#xff1a; ROI Pooling有两次量化操作&#xff0c;会引入误差影响精度 Mask RCNN针对这一缺点做了改进&#xff0c;此外Mask …

数据结构——顺序栈与链式栈的实现

目录 一、概念 1、栈的定义 2、栈顶 3、栈底 二、接口 1、可写接口 1&#xff09;数据入栈 2&#xff09;数据出栈 3&#xff09;清空栈 2、只读接口 1&#xff09;获取栈顶数据 2&#xff09;获取栈元素个数 3&#xff09;栈的判空 三、栈的基本运算 四、顺序栈&…

AtCoder Beginner Contest 297(A-E)

比赛地址: AtCoder Beginner Contest 297 - AtCoder A - Double Click 思路 : 直接模拟即可 代码 : #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std; typedef long long LL;inline vo…

springboot(ssm农产品直卖平台 农产品商城系统Java系统

springboot(ssm农产品直卖平台 农产品商城系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

Linux实战:部署基于Postfix 与 Dovecot 的邮件系统

一、电子邮件系统简介 在电子邮件系统中&#xff0c;为用户收发邮件的服务器名为邮件用户代理&#xff08;Mail User Agent&#xff0c;MUA&#xff09;&#xff0c;MTA &#xff08;邮件传输代理&#xff09;的工作职责是转发处理不同电子邮件服务供应商之间的邮件&#xff0…

目标检测 YOLOv5 - 推理时的数据增强

目标检测 YOLOv5 - 推理时的数据增强 flyfish 版本 YOLOv5 6.2 参考地址 https://github.com/ultralytics/yolov5/issues/303在训练时可以使用数据增强&#xff0c;在推理阶段也可以使用数据增强 在测试使用数据增强有个名字叫做Test-Time Augmentation (TTA) 实际使用中使…