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(); ? ? ? ? ? ?//注冊hubapp.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 2.0使用SignalR技術
-
在ASP.NET Core下使用SignalR技術
-
SignalR的性能監測與服務器的負載測試
-
ASP.NET SignalR 高可用設計
-
ASP.NET SignalR 2.0入門指南
-
SignalR SelfHost實時消息,集成到web中,實現服務器消息推送
-
ASP.NET WebHooks Receivers 介紹-WebHooks 讓其變得便捷
-
Signalr系列之虛擬目錄詳解與應用中的CDN加速實戰
-
采用HTML5+SignalR2.0(.Net)實現原生Web視頻
-
基于.NET SingalR,LayIM2.0實現的web聊天室
-
基于SignalR的消息推送與二維碼描登錄實現
原文:http://www.cnblogs.com/GuZhenYin/p/7992127.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 MQTTnet 快速实现 MQTT
- 下一篇: 35年编程史沉淀下来的8条宝贵经