目录

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>:&nbsp;&nbsp;' + 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预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)的更多相关文章

  1. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  2. 基于DevExpress的SpreadsheetControl实现对Excel的打开、预览、保存、另存为、打印(附源码下载)

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  3. (转)ASP.NET MVC 第五个预览版和表单提交场景

    转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...

  4. .NET 6 预览版 7:新功能已完成 ,将专注于改进

    .NET 团队的项目经理 Richard Lander在宣布 .NET 6 Preview 7 时说:"这是 .NET 预览的又一季的结束.", 中文翻译:.NET 6 预览版 7 ...

  5. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  6. 【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo

    开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩 ...

  7. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  8. 微软.NET CORE 3.0 预览版 7 发布:大幅减少 SDK 空间大小

    据悉,这个预览版是 .Net Core 3 中重要的版本,可以视为原计划在 7 月发布的 RC 版本 (引自微软 .NET Core 首席 Program Manager Richard 先生原话), ...

  9. 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64

    期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...

随机推荐

  1. 【深度学习】keras + tensorflow 实现猫和狗图像分类

    本文主要是使用[监督学习]实现一个图像分类器,目的是识别图片是猫还是狗. 从[数据预处理]到 [图片预测]实现一个完整的流程, 当然这个分类在 Kaggle 上已经有人用[迁移学习](VGG,Resn ...

  2. JQuerymobile实例源代码

    首页我们先来解释一下下JQuerymobile是什么,jQuery Mobile是JQuery 框架的一个组件(而非jquery的移动版本).jQuery Mobile是一款基于HTML5的用户界面系 ...

  3. TIDB技术文档翻译

    http://blog.csdn.net/antony9118/article/details/60470115

  4. 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )

    数据模型(LP32 ILP32 LP64 LLP64 ILP64 ) 32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的 ...

  5. HDU 4118 Holiday's Accommodation(树形DP)

    Holiday's Accommodation Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 200000/200000 K (Jav ...

  6. 关于安卓手机的牛逼软件termux使用

    最近在学着用linux,偶尔发现了一款神奇的软件--termux,termux是一款来自国外的终端模拟器,是运行在内部存储上的程序(不在内存卡上),功能比较强大,启动程序之后会进入命令行终端,需要基本 ...

  7. SSH框架的多表查询和增删查改 (方法一)上

    原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>  http://www.cnblogs.com/zhu520/p/7772823.html   因为最近在做Android 练习的 ...

  8. 脚本检测 media query 分界点

    当需要为不同屏幕大小添加不同脚本的时候,首先需要检测对应的media query 是否起效 也就是CSS( @screen only and (min-width: 40em) {})和javascr ...

  9. nohup和&后台运行,查看占用端口进程

    1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg - ] [ & ] 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup ...

  10. Halcon算子翻译——assign

    名称 assign-为控制变量分配一个新的值 用法 assign( : : Input : Result) 描述 为控制变量分配一个新的值. 在全文编辑器中,只需用:=就可以进行赋值,例如:  u : ...