最新要闻
- 天天短讯!越南地产大佬都做出60万的车了 建议国内这位好好学
- 环球快资讯丨2023元旦档总票房5.47亿:《阿凡达2》撑起“半壁江山”
- 天天通讯!手慢真无了!徐福记零食礼盒大促:39.9元到手 送礼有面
- 天天即时看!NVIDIA服软了!RTX 4070 Ti大量偷跑:价格低至6299元
- 环球速讯:国行6499元买到就是赚到?RTX 4070 Ti性能抢先看:对比4080
- 全球快看:你肯定达标了?31省份最低工资表公布:上海第一 超2500元
- 热议:29岁男子身高2.89米成世界上最高的人:还在生长中!
- 焦点快看:因14 Plus销量太差 曝苹果将对iPhone 15 Plus价格大调整
- 环球头条:超14亿美元!《阿凡达2》票房达到回本线 你贡献了几张票?
- 世界快看:3G CDMA再见!美国运营商关闭 中国电信也快关闭了
- 新消息丨苹果中国不手软:iPhone 14之前机型保修费大涨 700元换块电池
- 美好午餐肉罐头促销:5盒不到20元 味道鲜美入口留香
- 世界热门:电竞圈说的“满血”到底是啥 真能带来游戏体验升级?实测揭秘真相
- 女子花2700修热水器:成本只有13元
- 当前速读:今天是卢伟冰入职小米4周年!卢伟冰想起4年前雷军说过的话
- 取暖电器火了!成为老外眼中的香饽饽
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界热头条丨WPF+ASP.NET SignalR实现动态折线图
在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计。有没有那么一种场景,后台数据明明已经发生变化了,前台却因为没有及时刷新,而导致页面显示的数据与实际存在差异,从而造成错误的判断。那么如何才能在后台数据变更时及时通知客户端呢?本文以一个简单的动态折线图示例,简述如何通过ASP.NET SignalR实现后台通知功能,仅供学习分享使用,如有不足之处,还请指正。
【资料图】
什么是SignalR?
ASP.NET SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程。 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力。
SignalR做了什么?
传统HTTP采用的是大家熟知的“拉模式”,即客户端发出的每次请求,服务端都是被动处理。此场景下客户端是老大,很显然只有一方主动,操作与处理起来就没那么完美。
为了能让服务端也能主动,html5的出现让这种变得可能,大家知道html5中有两种主动模式。第一种叫做websockect,WebSockets是Html5提供的新的API,可以在Web网页与服务器端间建立Socket连接,它是基于tcp模式的双工通讯。还有一种叫做SSE,也就是客户端来订阅服务器的一种事件模型。
在html5出来之前,如果要做到服务器主动,我们只能采用变相的longpool和iframe流勉强实现。
SignalR对上面四种方案进行了高度的封装,也就是说signalR会在这四种技术中根据浏览器和服务器设置采取最优的一种模式。
封装与集成
对于.NET开发者的福音,.NET平台为我们提供了一种简洁高效智能的实时信息交互技术->SignalR,它集成了上述数种技术,并能根据配置自动或手动选择其最佳应用。
SignalR用途
SignalR 提供了一个简单的 API,用于创建服务器到客户端远程过程调用 (RPC) ,该调用客户端浏览器 (和其他客户端平台中的 JavaScript 函数) 服务器端 .NET 代码。 SignalR 还包括用于连接管理的 API (,例如连接和断开连接事件) ,以及分组连接。
虽然聊天通常被用作示例,但你可以做更多的事情。每当用户刷新网页以查看新数据时,或者该网页实施 Ajax 长轮询以检索新数据时,它都是使用 SignalR 的候选者。SignalR 还支持需要从服务器进行高频更新的全新类型的应用,例如实时游戏。
官方网址和源码
官方网址:https://dotnet.microsoft.com/zh-cn/apps/aspnet/signalr
微软API文档:https://learn.microsoft.com/zh-cn/aspnet/signalr/overview/getting-started/introduction-to-signalr
GitHub网址:https://github.com/SignalR
示例截图
本示例主要实现一个动态折线图功能,主要分为服务端和客户端两部分,示例如下所示:
服务端项目创建
1. 创建一个Web服务端程序(以ASP.NET WebApi为例),默认情况下SignalR已经作为项目框架的一部分而存在,所以不需要安装,直接使用即可。通过项目--依赖性--框架--Microsoft.AspNetCore.App可以查看
2. 创建ChatHub,继承Hub基类,作为后台连接管理的中心
1 using Microsoft.AspNetCore.SignalR; 2 3 namespace DemoSignalR.Server.Chat 4 { 5 public class ChatHub : Hub 6 { 7 #region 连接和断开连接 8 9 public override async Task OnConnectedAsync()10 {11 var connId = Context.ConnectionId;12 Console.WriteLine($"{connId} 已连接");13 await base.OnConnectedAsync();14 }15 16 public void StartNotify(string type)17 {18 if (type == "1")19 {20 21 }22 else if (type == "2")23 {24 25 };26 27 }28 29 public override async Task OnDisconnectedAsync(Exception ex)30 {31 //如果断开连接32 var connId = Context.ConnectionId;33 Console.WriteLine($"{connId} 已断开");34 await base.OnDisconnectedAsync(ex);35 }36 37 #endregion38 }39 }
SignalR服务端业务集成
在实际业务中,存在各种需要后台通知的功能,根据不同的业务,可以采用不同的通知触发方式:
1. 在调用接口时触发后台通知
1 using DemoSignalR.Server.Chat; 2 using Microsoft.AspNetCore.Mvc; 3 using Microsoft.AspNetCore.SignalR; 4 5 namespace DemoSignalR.Server.Controllers 6 { 7 [ApiController] 8 [Route("[controller]")] 9 public class TestWebApiController : ControllerBase10 {11 12 13 private readonly ILogger_logger;14 15 private IHubContext _context;16 17 public TestWebApiController(ILogger logger, IHubContext context)18 {19 _logger = logger;20 _context = context;21 }22 23 [HttpGet]24 public void GetTestA(string Name)25 {26 string info = $"当前接收到的信息为:{Name},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}";27 _context.Clients.All.SendAsync("", info);28 }29 30 31 }32 }
2. 定时器循环通知
1 using Microsoft.AspNetCore.SignalR; 2 using System.Timers; 3 4 namespace DemoSignalR.Server.Chat 5 { 6 public class TestChatInfo 7 { 8 private IHubContext_context; 9 10 private System.Timers.Timer _timer;11 12 private readonly static object locker = new object();//锁对象13 14 public static TestChatInfo instance;//当前实例15 16 private readonly ILogger _logger;17 18 private int _index = 0;19 20 private TestChatInfo(IHubContext _context, ILogger _logger)21 {22 this._context = _context;23 this._logger = _logger;24 //定义定时器25 _timer = new System.Timers.Timer(100);26 _timer.AutoReset = true;27 _timer.Enabled = true;28 _timer.Elapsed += Timer_Elapsed;29 _timer.Start();30 }31 32 private void Timer_Elapsed(object? sender, ElapsedEventArgs e)33 {34 //业务逻辑判断35 var obj = new TestValue();36 obj.Index = this._index;37 obj.Value = DateTime.Now.Millisecond % 100;38 _context.Clients.All.SendAsync("RefreshInfos", obj);39 this._index++;40 }41 42 /// 43 /// 注册,即初始化单例实例44 /// 45 /// 46 /// 47 /// 48 public static void Register(IHubContextcontext, ILogger logger)49 {50 lock (locker)51 {52 if (instance == null)53 {54 lock (locker)55 {56 instance = new TestChatInfo(context, logger);57 }58 }59 }60 }61 62 }63 64 public class TestValue65 {66 private int index;67 public int Index { get { return index; } set { index = value; } }68 69 private float value;70 public float Value { get { return value; } set { this.value = value; } }71 }72 }
SignalR服务端配置
SignalR服务端配置主要分成三步:
1. 添加SignalR服务
2. 映射SignalR路由
3. 注册单例后台通知服务(如果其他方式,可省略)
1 using DemoSignalR.Server.Chat; 2 using Microsoft.AspNetCore.SignalR; 3 4 var builder = WebApplication.CreateBuilder(args); 5 6 // Add services to the container. 7 8 builder.Services.AddControllers(); 9 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle10 builder.Services.AddEndpointsApiExplorer();11 builder.Services.AddSwaggerGen();12 //1.添加SignalR服务13 builder.Services.AddSignalR();14 builder.Services.AddLogging(logging => logging.AddConsole());15 16 var app = builder.Build();17 18 // Configure the HTTP request pipeline.19 if (app.Environment.IsDevelopment())20 {21 app.UseSwagger();22 app.UseSwaggerUI();23 }24 app.UseRouting();25 app.UseHttpsRedirection();26 27 app.UseAuthorization();28 29 30 //在Use中注册单例实例31 app.Use(async (context, next) =>32 {33 var hubContext = context.RequestServices.GetRequiredService>();34 //var logger = context.RequestServices.GetRequiredService ();35 TestChatInfo.Register(hubContext, null);//调用静态方法注册36 if (next != null)37 {38 await next.Invoke();39 }40 });41 42 app.MapControllers();43 44 //2.映射路由45 app.UseEndpoints(endpoints => {46 endpoints.MapHub ("/chat");47 });48 49 app.Run();
客户端项目创建
1. 创建WPF项目
2. 通过NuGet包管理器安装SignalR客户端
3. 创建SignalR状态管理,主要管理SignalR的连接,关闭,重连等操作。
1 using Microsoft.AspNetCore.SignalR.Client; 2 using System; 3 using System.Collections.Generic; 4 using System.Configuration; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace DemoSignalR.Client10 {11 internal class SignalRClient12 {13 private readonly HubConnection hubConnection;14 15 public HubConnection HubConnection16 {17 get { return hubConnection; }18 }19 20 public SignalRClient()21 {22 var server = ConfigurationManager.AppSettings["Server"].ToString();23 hubConnection = new HubConnectionBuilder().WithUrl($"{server}/chat").WithAutomaticReconnect().Build();24 hubConnection.KeepAliveInterval = TimeSpan.FromSeconds(5);25 }26 27 public virtual void Listen()28 {29 30 }31 32 public async void Start()33 {34 try35 {36 await hubConnection.StartAsync();37 38 }39 catch (Exception e)40 {41 42 }43 }44 }45 }
客户端业务逻辑处理
1. 根据不同的业务逻辑分别监听不同的通知事件。
2. 示例详见源码
1 using Microsoft.AspNetCore.SignalR.Client; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace DemoSignalR.Client 9 {10 internal class TestSignalRClient : SignalRClient11 {12 public Action
SignalR需要注意事项
你不会实例化 Hub 类或从服务器上自己的代码调用其方法;由 SignalR Hubs 管道为你完成的所有操作。 SignalR 每次需要处理中心操作(例如客户端连接、断开连接或向服务器发出方法调用时)时,SignalR 都会创建 Hub 类的新实例。
由于 Hub 类的实例是暂时性的,因此无法使用它们来维护从一个方法调用到下一个方法的状态。 每当服务器从客户端收到方法调用时,中心类的新实例都会处理消息。 若要通过多个连接和方法调用来维护状态,请使用一些其他方法(例如数据库)或 Hub 类上的静态变量,或者不派生自 Hub的其他类。 如果在内存中保留数据,请使用 Hub 类上的静态变量等方法,则应用域回收时数据将丢失。
如果要从在 Hub 类外部运行的代码将消息发送到客户端,则无法通过实例化 Hub 类实例来执行此操作,但可以通过获取对 Hub 类的 SignalR 上下文对象的引用来执行此操作。
注意:ChatHub每次调用都是一个新的实例,所以不可以有私有属性或变量,不可以保存对像的值,所以如果需要记录一些持久保存的值,则可以采用静态变量,或者中心以外的对象。
关于源码
本示例中相关源码,已上传至gitee(码云),链接如下:https://gitee.com/ahsiang/demo-signal-r
备注
以上就是WPF+ASP.NET SignalR实现动态折线图的全部内容,关于SignalR的应用,这只是一个简单的入门示例,希望可以抛砖引玉,一起学习,共同进步。学习编程,从关注【老码识途】开始!!!
世界热头条丨WPF+ASP.NET SignalR实现动态折线图
世界头条:1. 线程管理基础
天天短讯!越南地产大佬都做出60万的车了 建议国内这位好好学
环球快资讯丨2023元旦档总票房5.47亿:《阿凡达2》撑起“半壁江山”
bbs项目(部分讲解)
天天通讯!手慢真无了!徐福记零食礼盒大促:39.9元到手 送礼有面
天天即时看!NVIDIA服软了!RTX 4070 Ti大量偷跑:价格低至6299元
环球速讯:国行6499元买到就是赚到?RTX 4070 Ti性能抢先看:对比4080
世界观焦点:解放生产力!一文教你快速入门正则表达式
全球快看:你肯定达标了?31省份最低工资表公布:上海第一 超2500元
热议:29岁男子身高2.89米成世界上最高的人:还在生长中!
JavaWeb学习笔记
焦点快看:因14 Plus销量太差 曝苹果将对iPhone 15 Plus价格大调整
环球头条:超14亿美元!《阿凡达2》票房达到回本线 你贡献了几张票?
世界快看:3G CDMA再见!美国运营商关闭 中国电信也快关闭了
新消息丨苹果中国不手软:iPhone 14之前机型保修费大涨 700元换块电池
即时焦点:tclap库的使用
美好午餐肉罐头促销:5盒不到20元 味道鲜美入口留香
天天新资讯:MySQL——基础架构
Python类与对象详解
【环球热闻】Python重用父类方法
Python类的封装教程
世界热门:电竞圈说的“满血”到底是啥 真能带来游戏体验升级?实测揭秘真相
女子花2700修热水器:成本只有13元
docker复杂安装
热点在线丨AcWing1170. 排队布局[USACO05]
当前速读:今天是卢伟冰入职小米4周年!卢伟冰想起4年前雷军说过的话
取暖电器火了!成为老外眼中的香饽饽
看点:docker安装软件
天天看点:根治安卓卡顿!一加11超21万人预约:本周发
蔚来2022年累计交付新车122486辆 明年目标超雷克萨斯
速讯:微软吹大了!Win11流畅度没那么神:Office/PS还没Win10快
实时焦点:女子跨年夜捡烟花废品赚552元 一晚上捡了920斤:网友叹服人勤劳怎么都赚钱
2023油价新年第一涨来了:我国汽油全面进入国六B时代 油品质量不缩水
全球微动态丨2022年第一票房是《壮志凌云2》 阿汤哥驾F14胜5代战机的爽片赢下全球影迷
全球播报:JDBC
Maven基础
【天天新要闻】Redmi 12C只卖699元:但支持双频WiFi 还有3.5mm耳机孔和TF卡槽
当前信息:三亚近期酒店房间几乎售罄:飞机上坐满了人
世界通讯!摄影师对小米13 Pro长焦刮目相看:原本不抱希望 但实际效果令人意外
世界消息!一加11本周发!李杰:一部你越用越爱、越用越惊喜的手机
实时焦点:甘肃省高速公路实施差异化收费 绿牌新能源最高能省50%过路费
焦点短讯!女子接触发霉玉米肺里长黄曲霉菌 没戴口罩防护:医生科普毒性超强
特斯拉美国遭起诉:违反劳动法
焦点简讯:1TB+ SSD固态盘继续便宜 用户消费不动:微软背锅
当前快讯:东北500米超长冰滑梯走红!世界最长“出溜滑”:1秒10米风驰电掣
动态焦点:一招轻松解决node内存溢出问题
环球视讯!2020年“老卡”姗姗来迟:映泰突然推出RTX 3080/3070非公显卡
世界聚焦:PG认证的注意事项 (这很重要!)
【全球聚看点】《原神》赚麻了!推出2年移动端收入超过275亿元
视讯!3人同时订酒店价格相差1倍 去哪儿回应:正常 因素有很多
观天下!Django中间件
环球看点!造车新势力第一!2022年埃安累计销量27.1万辆 明年冲击60万辆
热头条丨Django组件之form组件
全球观察:索尼音乐在B站传了17万个视频 网友:当免费服务器了
当前时讯:比亚迪技术加持 创维汽车2022年总销量21916台 暴增255.72%
天天日报丨复兴号新动车元旦首秀:红白灰绿四色机身成“网红”车型
N95有效防护时间为4到6小时:和戴普通口罩效果有什么区别?
Django组件之Ajax请求
视焦点讯!RTX 4070 Ti完整规格、性能曝光:4090一半性能、一半的价格
新年快乐!今天遇到一个问题:3个鸡蛋5元,6个鸡蛋多少钱?
iPhone 15 mini重出江湖?苹果把这几个功能加上卖爆
世界热文:蒙脱石散为啥突然火了?医生提醒:不要乱用 小心便秘
今日快讯:关于使用boto3方式获取AWS-所有EC2-机型及属性时所遇到的结果返回不全的坑点及使用分布机制的解决方法
世界快讯:web项目开发---第三天
环球关注:1月4日发布!一加11官宣搭载双环式对磁扬声器:支持杜比全景声
世界讯息:新能源补贴正式终止!小鹏宣布:2023年各车型售价与补贴后一致
MAUI新生6.6-搜索栏SearchHandler
今日热搜:岚图汽车12月交付1729辆 大增14.7%!全年累计交付19409辆
每日焦点!得到跨年演讲2023
环球微速讯:《阿凡达2》成第100部内地票房破10亿电影:当年《阿凡达1》是第1部
Django模板层
今日看点:外观帅炸了!阿富汗首款国产跑车随风雪亮相喀布尔
《王者荣耀》盘古即将获得品质升级:上手难度大幅下降
每日短讯:跨年夜无人机被气球缠绕坠落人群 引发一阵惊呼
【世界热闻】从系统整体观思考系统构建
大年初一上映!《流浪地球2》微笑海报发布:主创全员出镜
2023全年油价调整时间表出炉:1月3日第一调 要涨
AcWing362. 区间
最新消息:你看过几场?2022年国内电影总票房超300亿
即时焦点:必囤:百草味年货坚果大礼包1370g/8袋仅49元
微速讯:特斯拉拼了:其他品牌车辆置换特斯拉 3.2万元功能免费用90天
全球首架国产大飞机C919新年首飞:验证飞行将达100小时
每日快看:全球最大第三方Android系统!基于Android 13的LineageOS 20正式发布
全球今头条!联想新款迷你主机M60Q官宣:厚度仅3.4厘米 可选12代i5
当前简讯:2023大事前瞻:杭州亚运会9月举办 首次纳入电竞比赛项目
热头条丨日本外卖小哥晒收入:月入合人民币5.5万元
观察:MYSQL安装教程及sqlyog初次使用
全球焦点!80秒看全球跨年烟火秀:用璀璨夜空迎接2023 你那能放烟花吗
【天天热闻】中国汽车保有量超3亿辆 千人拥有量达220辆 已成普通家庭消费品
搜索页上全是广告和推荐?用这插件一键去除
播报:新规即日起开始执行!手机预装App终于可以卸载了
苹果4GB内存为何能击败安卓12GB?历代iPhone内存容量公布:最大不过6GB
每日热议!铁路新规今日起施行:实名制儿童火车票将按照年龄购买 不看身高
焦点热讯:MAUI新生6.5-导航路由Navigation
每日资讯:Intel带着56核心再次发烧!新座驾降临 能插16条内存
环球头条:大批192号段诈骗电话出现!中国广电发布提醒:电商客服不会用192
热文:一项大奖的所有得主:都没有后代 为什么呢?
动态焦点:SpaceX预告2023年第一发:一箭114星!超越印度新纪录
要再见了!《魔兽世界》临时充值渠道将于1月1日0点正式关闭