日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

發(fā)布時(shí)間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

一晃一個(gè)月又過(guò)去了,上個(gè)月有個(gè)比較大的項(xiàng)目要驗(yàn)收上線(xiàn).所以忙的腳不沾地.現(xiàn)在終于可以忙里偷閑,寫(xiě)一篇關(guān)于SignalR Core的文章了.

先介紹一下SignalR吧,如下:

ASP.NET SignalR是ASP.NET開(kāi)發(fā)人員的一個(gè)庫(kù),它簡(jiǎn)化了向Web應(yīng)用程序添加即時(shí)通訊功能的過(guò)程。

它可以讓服務(wù)器在可用時(shí)立即向連接的客戶(hù)端推送內(nèi)容,而不是讓服務(wù)器等待客戶(hù)端請(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)啟客戶(hù)端訂閱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)啟所有的客戶(hù)端訂閱.

也就是調(diào)用客戶(hù)端的?streamStarted 方法.

然后客戶(hù)端的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)我們的客戶(hù)端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>:&nbsp;&nbsp;' + data;document.getElementById('discussion').appendChild(liElement);} ? ? ? ?//開(kāi)啟連接connection.start();

解釋都已經(jīng)在注釋里面了,請(qǐng)仔細(xì)看注釋.

最后實(shí)現(xiàn)的效果如下:

這里的demo是直接開(kāi)啟所有連接的客戶(hù)端的消息訂閱..你也可以針對(duì)單獨(dú)用戶(hù)來(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è)置客戶(hù)端使用messsagepack的協(xié)議來(lái)傳遞二進(jìn)制數(shù)據(jù)。

首先我們來(lái)了解一下messsagepack協(xié)議,大家可以搜一下他的官網(wǎng),很簡(jiǎn)單粗暴的一句話(huà).

它類(lèi)似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ì)用戶(hù)傳輸?shù)臄?shù)據(jù)好像沒(méi)有什么精簡(jiǎn),但是對(duì)一些SignalR自己傳遞的JSON做了相關(guān)的二進(jìn)制化..也許是我使用的方法不對(duì) - -,

?

寫(xiě)在最后

本文到此也就結(jié)束了,SignalR core版本目前還是在預(yù)覽的狀態(tài),所以很多東西并不是完全確定下來(lái)的,以后有更新的消息,我會(huì)第一時(shí)間寫(xiě)出博客分享.

文章中的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入門(mén)指南

  • 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ū)新聞,深度好文,歡迎訪(fǎng)問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。