Asp.net Core中SignalR 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 = 0; i < 10; i++)
                    {
                        observer.OnNext($"发送内容......{i}");
                        await Task.Delay(1000);
                    }
                });
        }
    }

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT米粉

我的Markdown的利器——Markdown Here、有道云笔记、iPic

Markdown逐渐成为大家文章编辑的首选,这里推荐两个比较冷门的Markdown工具。 用什么当做Markdown的主力工具? 网上有很多人推荐的Markdo...

35640
来自专栏逸鹏说道

ASP.NET5 Beta8可用性

ASP.NET5 beta8现已上都的NuGet作为一个工具升级到Visual Studio2015!此版本极大地扩展.NET核心对OS X和Linux所支持的...

393160
来自专栏FreeBuf

如何利用日志来监控和限制PowerShell攻击活动

写在前面的话 近期,我一直在我客户的网络环境中分析PowerShell攻击,根据我的分析以及研究结果,我发现了几种方法来帮助研究人员检测潜在的PowerShel...

26550
来自专栏大内老A

“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用

微软在2002年推出了第一个版本的 .NET Framework,这是一个主要面向Windows 桌面(Windows Forms)和服务器(ASP.NET W...

22060
来自专栏Crossin的编程教室

Windows 下的包管理器

这是一篇读者投稿。 包管理器的概念源自 Linux,与 Windows 单独下载安装软件不同,包管理器可以管理各种软件,做到统一的安装、更新和删除。某种程度上来...

35950
来自专栏GuZhenYin

SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测...

26160
来自专栏逆向技术

win32之进程概念

  学习WindowsAPI. 之前.我们必须理解什么是进程. 在windows环境下.进程就是一个运行起来的exe程序

9920
来自专栏walterlv - 吕毅的博客

如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference)

发布于 2018-05-13 09:07 更新于 2018-06...

6610
来自专栏张善友的专栏

Windows Server AppFabric正式发布

Windows Server AppFabric 是一组集成技术,可更轻松地生成、扩展和管理 IIS 上运行的 Web 应用程序和复合应用程序,它是一款主要面向...

21580
来自专栏张善友的专栏

创建安全的ASP.NET虚拟主机

随着基于.net平台的应用程序的数量级增加,提供.net空间的虚拟主机商也越来越多,但是有不少的虚拟主机提供商对.net环境的权限分配并不是非常的熟悉,从而导致...

359100

扫码关注云+社区

领取腾讯云代金券