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对服务器进行定时轮询查询,刚刚开始数据量和使用量不大的时候还好,后来使用量的增加和系统中各种 ...
随机推荐
- Vue的组件为什么要export default
Vue 的模块机制 Vue 是通过 webpack 实现的模块化,因此可以使用 import 来引入模块,例如: 此外,你还可以在bulid/webpack.base.conf.js文件中修改相关配置 ...
- Chrome 浏览器各版本下载大全【转载】
随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...
- Lintcode221 Add Two Numbers II solution 题解
[题目描述] You have two numbers represented by a linked list, where each node contains a single digit. T ...
- java中四种操作xml方式的比较
1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息. ...
- shell常见脚本30例
shell常见脚本30例 author:headsen chen 2017-10-19 10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...
- 剑指Offer-对称的二叉树
package Tree; /** * 对称的二叉树 * 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. */ public class ...
- webpack4新特性介绍
导语: webpack是一个JS应用打包器, 它将应用中的各个模块打成一个或者多个bundle文件.借助loaders和plugins,它可以改变.压缩和优化各种各样的文件.它的输入是不同的资源,比如 ...
- 前端touch事件方向的判断
移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...
- 常用Markdown公式整理 && 页内跳转注意 && Markdown preview
目录: 常用Markdown公式及注意事项 标题 列表 链接 区块 代码块 / 引用 粗体和斜体 文字块 图片 表格 横线 页内跳转注意事项 其他重要需注意 Markdown preview 前提: ...
- SpringBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...