Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
前言
一晃一個(gè)月又過(guò)去了,上個(gè)月有個(gè)比較大的項(xiàng)目要驗(yàn)收上線.所以忙的腳不沾地.現(xiàn)在終于可以忙里偷閑,寫一篇關(guān)于SignalR Core的文章了.
先介紹一下SignalR吧,如下:
ASP.NET SignalR是ASP.NET開(kāi)發(fā)人員的一個(gè)庫(kù),它簡(jiǎn)化了向Web應(yīng)用程序添加即時(shí)通訊功能的過(guò)程。
它可以讓服務(wù)器在可用時(shí)立即向連接的客戶端推送內(nèi)容,而不是讓服務(wù)器等待客戶端請(qǐng)求新數(shù)據(jù)。
當(dāng)然,在新的ASP.NET Core中,它也被重新設(shè)計(jì)并加入到ASP.NET 全家桶中....
Core版本的SignalR基礎(chǔ)通訊的用法與原來(lái)并沒(méi)有多大的區(qū)別,大家可以自行參考前面的資料,或者參考園子里的相關(guān)資料.
今天我們主要來(lái)講講SignalR Core發(fā)布的預(yù)覽版2的一些讓人興奮的新特性.
?
準(zhǔn)備工作
安裝.NET Core2.0+?
引用預(yù)覽版的Microsoft.AspNetCore.SignalR?1.0.0-alpha2-final
需要了解ASP.NET Core的管道機(jī)制.
正文
1.消息訂閱(觀察者模式)
這里不對(duì)這個(gè)模式做過(guò)多的講解,具體內(nèi)容請(qǐng)移步:百度百科
首先我們創(chuàng)建一個(gè)ASP.NET Core的空項(xiàng)目
然后添加相關(guān)引用Microsoft.AspNetCore.SignalR .
然后,添加我們的熟悉的SignalR Hub,如下:
public class StreamingHub : Hub { ? ? ?
??public void SendStreamInit(){ ? ? ? ? ? ?//開(kāi)啟客戶端訂閱Clients.All.InvokeAsync("streamStarted");} ?
? ? ?//被訂閱的消息public IObservable<string> StartStreaming(){ ? ? ?
? ? ?return Observable.Create( ? ? ? ? ? ?
? ?async (IObserver<string> observer) =>{ for (int i = 0; i < 10; i++){observer.OnNext($"發(fā)送內(nèi)容......{i}"); ? ? ? ? ? ? ? ? ? ? ? ?await Task.Delay(1000);}});}}
hub里面的內(nèi)容,我先講解一下:
我們首先創(chuàng)建一個(gè)SendStreamInit的方法,來(lái)開(kāi)啟所有的客戶端訂閱.
也就是調(diào)用客戶端的?streamStarted 方法.
然后客戶端的streamStarted 方法來(lái)訂閱我們的StartStreaming,
StartStreaming里面創(chuàng)建一個(gè)觀察者,來(lái)觀察一個(gè)序列,每一秒發(fā)送一個(gè)內(nèi)容,循環(huán)10次
?
然后,我們?cè)赟tartup中注冊(cè)我們添加的hub,如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env){ ? ? ? ? ?? ?if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseFileServer(); ? ? ? ? ? ?//注冊(cè)hubapp.UseSignalR(routes =>{routes.MapHub<StreamingHub>("streaming");});}
接下來(lái),實(shí)現(xiàn)我們的客戶端JS,如下:
//設(shè)置連接方式//var transport = signalR.TransportType.WebSockets;var transport = signalR.TransportType.LongPolling; //創(chuàng)建連接var connection = new signalR.HubConnection(`http://${document.location.host}/streaming`, { transport: transport });//獲取按鈕var button = document.getElementById("startStreaming"); ?? ? ?//注冊(cè)訂閱方法function startStreaming(){connection.stream("StartStreaming").subscribe({next: onStreamReceived,err: function(err){console.log(err);},complete: function(){console.log("完成流傳輸");}});} ? ? ? ?
//注冊(cè)開(kāi)啟注冊(cè)的方法connection.on("streamStarted", function(){startStreaming();}); ? ?
? ?//添加按鈕事件,調(diào)用初始化訂閱的方法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);} ? ? ? ?//開(kāi)啟連接connection.start();
解釋都已經(jīng)在注釋里面了,請(qǐng)仔細(xì)看注釋.
最后實(shí)現(xiàn)的效果如下:
這里的demo是直接開(kāi)啟所有連接的客戶端的消息訂閱..你也可以針對(duì)單獨(dú)用戶來(lái)開(kāi)啟訂閱.
?
2.發(fā)送二進(jìn)制字節(jié)
這是一個(gè)重大的進(jìn)步.到目前為止,我們只使用了JSON協(xié)議來(lái)發(fā)送數(shù)據(jù)。新的SignalR Core在數(shù)據(jù)協(xié)議方面有一個(gè)很大的進(jìn)步.就是提升了發(fā)送二進(jìn)制編碼數(shù)據(jù)的能力。
下面將介紹如何設(shè)置客戶端使用messsagepack的協(xié)議來(lái)傳遞二進(jìn)制數(shù)據(jù)。
首先我們來(lái)了解一下messsagepack協(xié)議,大家可以搜一下他的官網(wǎng),很簡(jiǎn)單粗暴的一句話.
它類似JSON,
但是更快,更小。
使用的方式也很簡(jiǎn)單.
后臺(tái)代碼不需要任何改動(dòng).
前端需要多引用一個(gè)消息協(xié)議的JS文件
如:? ? <script type="text/javascript" src="signalr-msgpackprotocol-1.0.0-alpha2-final.js"></script>
JS代碼修改如下:
//設(shè)置連接方式var transport = signalR.TransportType.LongPolling;//設(shè)置消息協(xié)議var protocol = new signalRMsgPack.MessagePackHubProtocol();//初始化連接
var connection = new signalR.HubConnection('http://localhost:58619//chat', { transport: transport, protocol: protocol });
這樣,我們就完成了相關(guān)的消息設(shè)置.
我們來(lái)看看效果:
我們傳遞一個(gè)字符串.采用JSON傳遞,大小為1.4K
response內(nèi)容如下:
?
?
然后我們改為MessagePack協(xié)議發(fā)送同樣的數(shù)據(jù),會(huì)發(fā)現(xiàn)數(shù)據(jù)稍微小了一點(diǎn),為1.2KB
response內(nèi)容如下:
發(fā)現(xiàn)對(duì)用戶傳輸?shù)臄?shù)據(jù)好像沒(méi)有什么精簡(jiǎn),但是對(duì)一些SignalR自己傳遞的JSON做了相關(guān)的二進(jìn)制化..也許是我使用的方法不對(duì) - -,
?
寫在最后
本文到此也就結(jié)束了,SignalR core版本目前還是在預(yù)覽的狀態(tài),所以很多東西并不是完全確定下來(lái)的,以后有更新的消息,我會(huì)第一時(shí)間寫出博客分享.
文章中的demo源碼地址:https://github.com/l2999019/Signalr_AspNetCoreDemo
相關(guān)文章:?
-
在ASP.NET CORE 2.0使用SignalR技術(shù)
-
在ASP.NET Core下使用SignalR技術(shù)
-
SignalR的性能監(jiān)測(cè)與服務(wù)器的負(fù)載測(cè)試
-
ASP.NET SignalR 高可用設(shè)計(jì)
-
ASP.NET SignalR 2.0入門指南
-
SignalR SelfHost實(shí)時(shí)消息,集成到web中,實(shí)現(xiàn)服務(wù)器消息推送
-
ASP.NET WebHooks Receivers 介紹-WebHooks 讓其變得便捷
-
Signalr系列之虛擬目錄詳解與應(yīng)用中的CDN加速實(shí)戰(zhàn)
-
采用HTML5+SignalR2.0(.Net)實(shí)現(xiàn)原生Web視頻
-
基于.NET SingalR,LayIM2.0實(shí)現(xiàn)的web聊天室
-
基于SignalR的消息推送與二維碼描登錄實(shí)現(xiàn)
原文:http://www.cnblogs.com/GuZhenYin/p/7992127.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用 MQTTnet 快速实现 MQTT
- 下一篇: 35年编程史沉淀下来的8条宝贵经