signalR 消息推送
业务情景一:上传报表,上传excel。如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求。用户上传之后,很关心上传的进度和结果。
业务情景二:站内消息提醒,实时有效地接受消息。
对于这些需求,第一时间想到的是,前端定时去轮询数据,返回一个进度或者未读的站内消息。
这样虽然能达到目的,但是付出的代价是昂贵的。站点24小时,不断地在请求接口,数据库不断地在被访问,这是客户端主动请求所带来的弊端。
换一个角度,如果是服务端主动去推送消息给客户端,那么性能势必能大幅增加,同时推送的消息更为及时、准确。
SignalR对常用实时通讯技术进行了封装, SignalR当WebSocket可用时优先使用新式的WebSocket传输,同时也兼容老式的传输。
SignalR支持以一种简单的API来创建服务器到客户端的远程调用客户端的Javascript方法,SignalR还包括用于用于连接管理的API和分组连接。
新建一个.net core console程序,引入nuget包
以下是服务端代码,主程序创建了一个站内,站点启动时注入了一个hubcontext的实例,这个hubcontext的主要工作是,每隔一秒钟触发客户端去执行OnReportPublished方法。
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading;
using System.Threading.Tasks; namespace OneCode.SignalR
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
} public class MyHub : Hub
{
//此方法用于被客户端调用,当客户端执行 hubConnection.invoke('PublishReport', $('#reportName').val()); 会触发此方法执行
public Task PublishReport(string reportName)
{
//主动通知客户端去执行客户端本身的方法,此代码执行后
//hubConnection.on('OnReportPublished', data => {
// $('#reports').append($('<li>').text(data));
//}); //客户端将执行 OnReportPublished
return Clients.All.InvokeAsync("OnReportPublished", reportName);
} public async void Echo(string sendMan)
{
while (true)
{
await Clients.All.InvokeAsync("OnReportPublished", $"{DateTime.Now}:{sendMan}:{ Guid.NewGuid().ToString()}");
Thread.Sleep( * );
}
}
} public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("fiver",
policy => policy.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod());
}); services.AddSignalR(); // <-- SignalR } public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseCors("fiver"); app.UseSignalR(routes => // <-- SignalR
{
routes.MapHub<MyHub>("myHub");
}); //IHubContext<MyHub> hubContext = serviceProvider.GetService<IHubContext<MyHub>>();
}
}
}
以下是客户端代码
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ASP.NET Core SignalR</title>
<script src="js/signalr-client.min.js"></script>
<script src="js/jquery.min.js"></script>
</head>
<body>
<div>
<h2>Reports</h2>
<button id="button">send</button>
<ul id="reports"></ul> <script>
$(function () { let hubUrl = 'http://localhost:5000/myHub';
let httpConnection = new signalR.HttpConnection(hubUrl);
let hubConnection = new signalR.HubConnection(httpConnection); $("#button").click(function () {
hubConnection.invoke('Echo', 'wiky');
}); hubConnection.on('OnReportPublished', data => {
$('#reports').append($('<li>').text(data));
}); hubConnection.start(); });
</script> </div>
</body>
</html>
以下是执行结果:
signalR 消息推送的更多相关文章
- WinForm中 Asp.Net Signalr消息推送测试实例
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Asp.net MVC企业级开发(04)---SignalR消息推送
Asp.net SignalR是微软为实现实时通信而开发的一个类库.可以适用于以下场景: 聊天室,如在线客服系统,IM系统等 股票价格实时更新 消息的推送服务 游戏中人物位置的实时推送 SignalR ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- C# BS消息推送 SignalR Hubs环境搭建与开发(二)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 开始开发 1)新建一个MVC项目,叫做SignalRDemo 2)安装SignalR包 In ...
- Asp.net SignalR 实现服务端消息推送到Web端
之前的文章介绍过Asp.net SignalR, ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 今天我 ...
- AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...
- SignalR Self Host+MVC等多端消息推送服务(1)
一.概述 由于项目需要,最近公司项目里有个模块功能,需要使用到即时获得审批通知:原本的设计方案是使用ajax对服务器进行定时轮询查询,刚刚开始数据量和使用量不大的时候还好,后来使用量的增加和系统中各种 ...
随机推荐
- luoguP2711 小行星
题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输入格式: 第1行为小行星个数 ...
- Android TV 电视调试和遥控器事件监听
Android TV 真机调试 要进行Android TV开发免不了要进行真机调试. 1.确定电视盒子和开发机器在同一局域网中 2.打开电视盒子的adb允许调试开关 3.进入adb所在文件夹进行adb ...
- webpack4: compilation.mainTemplate.applyPluginsWaterfall is not a function 解决方法
今天捣鼓webpack4踩到一个弥天大坑:使用html-webpack-plugin打包html的时候一直报 compilation.mainTemplate.applyPluginsWaterfal ...
- CDN和CDN加速原理
随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...
- 面向对象写的简单的colors rain
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- ELK日志收集平台部署
需求背景 由于公司的后台服务有三台,每当后台服务运行异常,需要看日志排查错误的时候,都必须开启3个ssh窗口进行查看,研发们觉得很不方便,于是便有了统一日志收集与查看的需求. 这里,我用ELK集群,通 ...
- 总结linux路由技术
Linux系统的route命令用于显示和操作IP路由表,要实现两个不同的网段之间的通信,需要一台连接两个网络的路由器,或者同时连接位于两个网络的网关来实现. 在Linux系统中,设置路由通常是为了解决 ...
- Algorithm --> 树中求顶点A和B共同祖先
树中求顶点A和B共同祖先 题目: 给定一颗树,以及两个顶点A和B,求最近的共同祖先,和包含的子顶点个数? 比如:给定如下图的树,以及顶点13和8,则共同祖先为3,以3为root的子顶点共有8个
- Algorithm --> 快速排序
快速排序 算法思想 快速排序采用的思想是分治思想. 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的 元素值都 ...
- NOIP2017划水崩盘记
Before-Day1 自信心爆棚,老子一定能拿省一.一天啥也没干,一顿乱奶.敬等明日切T1写暴力. Day 1 哈哈哈,T1是数论,闭眼睛切啊!! ...然后就Gg了,写的 ...