Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
SignalR系列目录(注意,是ASP.NET的目录.不是Core的)
一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了.
先介绍一下SignalR吧,如下:
ASP.NET SignalR是ASP.NET开发人员的一个库,它简化了向Web应用程序添加即时通讯功能的过程。
它可以让服务器在可用时立即向连接的客户端推送内容,而不是让服务器等待客户端请求新数据。
当然,在新的ASP.NET Core中,它也被重新设计并加入到ASP.NET 全家桶中....
Core版本的SignalR基础通讯的用法与原来并没有多大的区别,大家可以自行参考前面的资料,或者参考园子里的相关资料.
今天我们主要来讲讲SignalR Core发布的预览版2的一些让人兴奋的新特性.
安装.NET Core2.0+
引用预览版的Microsoft.AspNetCore.SignalR 1.0.0-alpha2-final
需要了解ASP.NET Core的管道机制.
1.消息订阅(观察者模式)
这里不对这个模式做过多的讲解,具体内容请移步:百度百科
首先我们创建一个ASP.NET Core的空项目
然后添加相关引用Microsoft.AspNetCore.SignalR .
然后,添加我们的熟悉的SignalR Hub,如下:
public class StreamingHub : Hub
{ public void SendStreamInit()
{
//开启客户端订阅
Clients.All.InvokeAsync("streamStarted");
} //被订阅的消息
public IObservable<string> StartStreaming()
{
return Observable.Create(
async (IObserver<string> observer) =>
{
for (int i = ; i < ; i++)
{
observer.OnNext($"发送内容......{i}");
await Task.Delay();
}
});
}
}
hub里面的内容,我先讲解一下:
我们首先创建一个SendStreamInit的方法,来开启所有的客户端订阅.
也就是调用客户端的 streamStarted 方法.
然后客户端的streamStarted 方法来订阅我们的StartStreaming,
StartStreaming里面创建一个观察者,来观察一个序列,每一秒发送一个内容,循环10次
然后,我们在Startup中注册我们添加的hub,如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseFileServer(); //注册hub
app.UseSignalR(routes =>
{
routes.MapHub<StreamingHub>("streaming");
});
}
接下来,实现我们的客户端JS,如下:
//设置连接方式
//var transport = signalR.TransportType.WebSockets;
var transport = signalR.TransportType.LongPolling;
//创建连接
var connection = new signalR.HubConnection(`http://${document.location.host}/streaming`, { transport: transport });
//获取按钮
var button = document.getElementById("startStreaming");
//注册订阅方法
function startStreaming(){
connection.stream("StartStreaming").subscribe({
next: onStreamReceived,
err: function(err){
console.log(err);
},
complete: function(){
console.log("完成流传输");
}
});
}
//注册开启注册的方法
connection.on("streamStarted", function(){
startStreaming();
}); //添加按钮事件,调用初始化订阅的方法
button.addEventListener("click", event => {
connection.invoke("sendStreamInit");
}); //展示订阅得到的消息
function onStreamReceived(data){
console.log("收到消息: " + data);
var liElement = document.createElement('li');
liElement.innerHTML = '<strong>' + "收到消息" + '</strong>: ' + data;
document.getElementById('discussion').appendChild(liElement);
}
//开启连接
connection.start();
解释都已经在注释里面了,请仔细看注释.
最后实现的效果如下:
这里的demo是直接开启所有连接的客户端的消息订阅..你也可以针对单独用户来开启订阅.
2.发送二进制字节
这是一个重大的进步.到目前为止,我们只使用了JSON协议来发送数据。新的SignalR Core在数据协议方面有一个很大的进步.就是提升了发送二进制编码数据的能力。
下面将介绍如何设置客户端使用messsagepack的协议来传递二进制数据。
首先我们来了解一下messsagepack协议,大家可以搜一下他的官网,很简单粗暴的一句话.
它类似JSON,
但是更快,更小。
使用的方式也很简单.
后台代码不需要任何改动.
前端需要多引用一个消息协议的JS文件
如: <script type="text/javascript" src="signalr-msgpackprotocol-1.0.0-alpha2-final.js"></script>
JS代码修改如下:
//设置连接方式
var transport = signalR.TransportType.LongPolling;
//设置消息协议
var protocol = new signalRMsgPack.MessagePackHubProtocol();
//初始化连接
var connection = new signalR.HubConnection('http://localhost:58619//chat', { transport: transport, protocol: protocol });
这样,我们就完成了相关的消息设置.
我们来看看效果:
我们传递一个字符串.采用JSON传递,大小为1.4K
response内容如下:
然后我们改为MessagePack协议发送同样的数据,会发现数据稍微小了一点,为1.2KB
response内容如下:
发现对用户传输的数据好像没有什么精简,但是对一些SignalR自己传递的JSON做了相关的二进制化..也许是我使用的方法不对 - -,
本文到此也就结束了,SignalR core版本目前还是在预览的状态,所以很多东西并不是完全确定下来的,以后有更新的消息,我会第一时间写出博客分享.
文章中的demo源码地址:https://github.com/l2999019/Signalr_AspNetCoreDemo
Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)的更多相关文章
- 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...
- 基于DevExpress的SpreadsheetControl实现对Excel的打开、预览、保存、另存为、打印(附源码下载)
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- (转)ASP.NET MVC 第五个预览版和表单提交场景
转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...
- .NET 6 预览版 7:新功能已完成 ,将专注于改进
.NET 团队的项目经理 Richard Lander在宣布 .NET 6 Preview 7 时说:"这是 .NET 预览的又一季的结束.", 中文翻译:.NET 6 预览版 7 ...
- Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)
场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo
开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩 ...
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- 微软.NET CORE 3.0 预览版 7 发布:大幅减少 SDK 空间大小
据悉,这个预览版是 .Net Core 3 中重要的版本,可以视为原计划在 7 月发布的 RC 版本 (引自微软 .NET Core 首席 Program Manager Richard 先生原话), ...
- 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64
期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...
随机推荐
- Time模块和datetime模块
Time模块和datetime模块 一. 调用 import time #调用time模块 二.使用方法 1.time.time 拿到时间戳.以Linux诞生年份1970年开始计算到程序执 ...
- C++const使用(06)
可以在类中使用const关键字定义数据成员和成员函数或修饰一个对象.一个const对象只能访问const成员函数,否则将产生编译错误. 常量成员 常量成员包括常量数据成员.静态常数据成员和常引用.静态 ...
- LeetCode 561. Array Partition I (数组分隔之一)
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...
- Java基础笔记4
数组 有一组相同数据类型的数据. 数据类型[] 数组名称=new 数据类型[长度]; //为该数组开辟空间. 数据类型[] 数组名称={值,值}; 求数组的长度 数组名称.length; 获取数组中的 ...
- js解析器的执行原理
首先看一段代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- Spring框架学习之高级依赖关系配置(一)
上篇文章我们对Spring做了初步的学习,了解了基本的依赖注入思想.学会简单的配置bean.能够使用Spring容器管理我们的bean实例等.但这还只是相对较浅显的内容,本篇将介绍bean的相关更高级 ...
- 【ThinkPHP框架学习 】(1) --- thinkphp 3.2.3 验证码验证使用教程分享
框架版本:ThinkPHP框架 thinkphp 3.2.3 生成验证码 下面是最简单的方式生成验证码: $Verify = new \Think\Verify(); $Verify-> ...
- Muduo阅读笔记--base(二)
上一篇文章对muduo的入门做了介绍. http://www.cnblogs.com/LCCRNblog/p/5668035.html base文件夹下这么多代码,该如何入手呢?对于我这种第一次接触大 ...
- nova创建虚拟机源码分析系列之六 api入口create方法
openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...
- css元素选择器 first-child nth-child
E:first-child 只要E元素是它的父级的第一个子元素,就选中.它需要同时满足两个条件, (1)是"第一个子元素", (2)是"这个子元素刚好是E ...