目录

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. 使用 Skeleton Screen 提升用户感知体验

    1024程序猿节"愿世界和平,没有bug",腾讯云社区向改变世界的程序猿致敬! 作者:陈纬杰 一直以来,无论是web还是iOS.android的应用中,为了提升应用的加载等待这段时 ...

  2. 脚本div实现拖放功能

    脚本div实现拖放功能 网页上有很多拖曳的操作,比如拖动树状列表,可拖曳的图片等. 1.原生拖放实现 <!doctype html> <html lang="en" ...

  3. servlet的运行工作

    我是一个刚学几天的小白,写得不好,如果哪个地方有错误,欢迎你们指出. 在服务器端,我用的是Tomcat作为Servlet 容器,在容器中有一个Servlet接口,你编写一个servlet类放在Tomc ...

  4. Python实现网站注册验证码生成类

    # -*- coding:utf-8 -*- ''' Created on 2017年4月7日 @author: Water ''' import os import random import st ...

  5. Java基础笔记1

    java (开源,跨操作系统)j2ee jre java基础 javaoop java高级 JDK(JAVA developer Kitool): java开发工具 (开发人员使用) JRE(java ...

  6. C++ 标准库之iomanip

    C++ 标准库之iomanip istream & istream::get(char *, int, char = '\n');istream & istream::getline( ...

  7. CodeForces - 556B Case of Fake Numbers

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  8. Codeforces Round #386 (Div. 2) C. Tram

    C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  9. Even Tree 小议

    原题链接:https://www.hackerrank.com/challenges/even-tree/problem 思路:把树还原出来,对每个结点,计算以该结点为根的子树结点数.子树结点数为偶数 ...

  10. URLs对象 blob URL

    把指向数据的URL保存到file或者blob对象里,好处就是不需要先文件读取内容然后才能用.   function createObjectURL(blob){if (window.URL){retu ...