【SignalR全套系列】之在.Net Core 中實現Server-Send Events消息推送

微信公眾號:趣編程ACE
關注可了解更多的.NET日常開發技巧,如需源碼 請公眾號留言 源碼;
如果覺得本公眾號對你有幫助,歡迎關注

【SignalR全套系列】之在.Net Core 中實現Server-Send Events消息推送

1.前文鏈接:

【SignalR全套系列】之在.NetCore中實現WebSocket雙工通信

2.簡介:

嚴格來說,HTTP協議無法做到服務器主動推送消息,有一種變通方法就是,服務器告知客戶端我接下里要發送的是流信息,而SSE(Server-Send Events)就是基于這個原理來實現通信的。

SSE與WebSocket作用類似,都是作用于服務端與客戶端之間通信的,但是Websocket 是全雙工通信,而SSE只能是單工通信(服務器向瀏覽器發送)

具體講解可參考下面文章:
https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html

3.基于.Net Core 實現SSE

首先建立一個客戶端頁面程序:

1<!DOCTYPE?html>2<html>3<head>4????<meta?charset="utf-8"?/>5????<title></title>6</head>7<body>8????<script>9????????var?source?=?new?EventSource("/see");??//SSE?API對象
10????????//?onmessage?是用來接受消息的通用回調函數
11????????source.onmessage?=?(event)?=>?console.log('接收服務端消息',?event.data);
12????????//?onopen?當服務端與客戶端建立鏈接后?就會觸發open?事件
13????????source.onopen?=?()?=>?console.log("開始鏈接");
14????????//?通信失敗?就會觸發?error事件??這時候回調onerror函數
15????????source.onerror?=?(event)?=>?console.log(event);
16
17????????//?自定義事件?可以自定義需要執行的message事件??這時候通用的message事件就不會被觸發了
18????????source.addEventListener('custom',?(e)?=>?console.log('custom',?e.data));
19????</script>
20</body>
21</html>
服務端應用程序:
1public?class?Startup2????{34????????private?readonly?Channel<string>?_channel;?//?通道變量5????????public?Startup(IConfiguration?configuration)6????????{7????????????Configuration?=?configuration;8????????????_channel?=?Channel.CreateUnbounded<string>();?//?創建一個無消息上限的通道9????????}
10
11????????public?IConfiguration?Configuration?{?get;?}
12
13????????//?This?method?gets?called?by?the?runtime.?Use?this?method?to?add?services?to?the?container.
14????????public?void?ConfigureServices(IServiceCollection?services)
15????????{
16????????????services.AddControllers();
17????????}
18
19????????//?This?method?gets?called?by?the?runtime.?Use?this?method?to?configure?the?HTTP?request?pipeline.
20????????public?void?Configure(IApplicationBuilder?app,?IWebHostEnvironment?env)
21????????{
22????????????if?(env.IsDevelopment())
23????????????{
24????????????????app.UseDeveloperExceptionPage();
25????????????}
26
27????????????//?開啟靜態文件
28????????????app.UseStaticFiles();
29
30????????????app.UseRouting();
31
32????????????app.UseAuthorization();
33
34????????????app.UseEndpoints(endpoints?=>
35????????????{
36????????????????endpoints.MapControllers();
37????????????????//?捕獲路由??/send?m=xxxxx
38????????????????endpoints.Map("/send",?async?ctx?=>
39????????????????{
40????????????????????if?(ctx.Request.Query.TryGetValue("m",?out?var?m))
41????????????????????{
42????????????????????????//?控制臺輸出
43????????????????????????Trace.WriteLine("開始發送?:"?+?m);
44????????????????????????//??寫入到通道中去
45????????????????????????await?_channel.Writer.WriteAsync(m);
46????????????????????}
47????????????????????//?響應返回
48????????????????????ctx.Response.StatusCode?=?200;??
49????????????????});
50????????????});
51
52????????????//?自定義一個中間件
53????????????app.Use(async?(ctx,?next)?=>
54????????????{
55????????????????//?發送?/see?路由??建立鏈接
56????????????????if(ctx.Request.Path.ToString().Equals("/see"))
57????????????????{
58????????????????????var?response?=?ctx.Response;
59????????????????????//?以流的形式?返回給客戶端?
60????????????????????response.Headers.Add("Content-Type",?"text/event-stream");
61
62????????????????????//??返回響應信息??
63????????????????????await?response.WriteAsync("event:custom\r");
64????????????????????await?response.WriteAsync("data:自定義事件消息\r\r");
65
66????????????????????while(await?_channel.Reader.WaitToReadAsync())
67????????????????????{
68????????????????????????var?message?=?await?_channel.Reader.ReadAsync();
69????????????????????????Trace.WriteLine("捕捉發送消息:"+message);
70????????????????????????await?response.WriteAsync($"data:{message}\r\r");
71
72????????????????????????await?response.Body.FlushAsync();
73????????????????????}
74????????????????}
75????????????});
76????????}
77????}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286868.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GIS專業核心課程電子教材配套實驗數據匯總(持續更新)

本文整合了GIS專業核心課程電子pdf教材,包括地理信息系統、地圖學、遙感、攝影測量、遙感數字圖像處理、工程測量、施工測量、GPS、數字測圖、空間數據庫、程序設計等,持續更新。 一、ArcGIS10實驗教程(配套實驗數據) 二、地理信息系統

Android數據手冊:Android顏色碼制表

在Android應用開發中經常要用各種控件&#xff0c;并為控件設置其背景顏色&#xff0c;使用各種不同的顏色為控件著色是很有必要的。 在Android系統中&#xff0c;各種顏色與其對應的碼制如下所示&#xff1a; <resources> <color name"white">#ffffff…

Android之提示MIME type application/octet-stream cannot be inserted into **/images expected

1、問題 在三星手機(Androd10.0)我需要把圖片插入系統圖庫,錯誤提示如下 AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsinnova.android.keepdrop/com.appsinnova.android.keepdrop.account.AboutActivity}: java.lang.Ille…

7月18日實習日志

今天的上午的工作和昨天一樣&#xff0c;上午轉發了三十篇&#xff0c;基本上沒有遇到什么問題。下午還是轉載視頻和發稿。 轉載于:https://www.cnblogs.com/a1107/p/5706351.html

短網址服務設計

短網址服務設計 背景 短網址服務&#xff0c;用來將輸入的一個長網址轉換為一個短網址&#xff08;比如附錄中的案例&#xff09;&#xff0c;當用戶請求這個短網址時&#xff0c;服務查詢出真實的url; 設計這么一個短網址服務&#xff0c;需要考慮哪些點&#xff1f; 數據結構…

我抓到bit哥了,嘿嘿嘿(5)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

遙感、地理空間數據、全國基礎數據下載網站大全匯總

本文收集整理了國內外常用的遙感、GNSS、地理空間數據下載網站,可以下載各種格式的矢量、柵格等數據,主要包括遙感影像、NDVI、太陽輻射、數字高程模型等各種地理空間數據,供GISer學習交流使用。 1. 地理空間數據云 該網站為國內學者使用最多的、數據下載方便的網站,可以…

RPA之基于FlaUI的微信發送消息給某人

本文由網友藍創精英團隊投稿&#xff0c;歡迎轉載、分享原文作者&#xff1a;藍創精英團隊原文鏈接&#xff1a;https://kesshei.blog.csdn.net/article/details/124955177目的一直想實現微信的群發功能&#xff0c;但是&#xff0c;沒有實現&#xff0c;原因有一條是怕違法&am…

Android之通過文件絕對路徑獲取音視頻的時長和視頻的縮略圖

1 需求 遍歷一個文件夾,需要獲取音視頻的時長和視頻的第一幀圖像 2 關鍵代碼實現 獲取本地音視頻的時長(這里計算出來的是秒為單位),如果文件不是音視頻,下面的函數會發生異常,也就是返回0,我們除了通過文件頭來判斷這個文件是音視頻之后,然后再獲取這個文件的時長,如…

1.8-zabbix服務端安裝

zabbix 是另外一個用的比較多地監控工具&#xff0c;同樣也需要 apachephp 的支持&#xff0c;但它比nagios 要多一個 mysql&#xff0c;因為它有數據需要存儲。所以&#xff0c;安裝 zabbix&#xff0c;必須要安裝 mysql。cacti、nagios、zabbix都是用php寫的網頁&#xff0c;…

感受機房管理化繁為簡-新款KVM使用心得

感受機房管理化繁為簡-新款KVM使用心得 一、 背景 隨著網絡應用的不斷增多&#xff0c;各地機房服務器數量也隨之增加&#xff0c;利用多傳統主機切換器的方式已經無法滿足目前這種區域廣、設備多人員緊缺的現狀&#xff0c;而且即使是使用了一些遠程管理軟件&#xff0c;實現的…

我化身保姆為你提供 html 教學服務(6)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

那一年,我考入了西北師范大學GIS專業,然而我很迷茫,GISer的職業規劃到底是怎樣的?

那一年&#xff0c;我考入了西北師范大學&#xff0c;錄取專業為地理信息系統&#xff0c;也就是常說的GIS&#xff0c;本科畢業后又考取了GIS專業的研究生&#xff0c;順利畢業&#xff0c;進入了高校從事GIS教育工作。作為一個GISer&#xff0c;我相信有很多人跟我一樣很迷茫…

Python自動化之語法基礎

1 第一個程序 hello world 在Linux環境下執行 vim hello.py #!/usr/bin/env python #指定解釋器 print("hello world") 運行Python程序 Python hello.py 第一行是指定解釋器&#xff0c;另一種寫法是#!/usr/bin/python&#xff0c;后者限制了Python的位置&#x…

jquery分頁插件

jquery.mypagination.js 文件&#xff1a; /* * * * jquery分頁插件* 1.0 zheng 2014-03-18 * 1.1 兼容url包含#號地址&#xff0c;GoToPage可以指定錨點&#xff08;特殊需求&#xff09;2014-04-10 09:00:34* 1.2 可以配置分頁條列出頁面數* 1.3 增加了頁面碼跳轉功能* …

Android之如何分析手機系統相冊圖片和視頻刪除后保存的位置

1 需求 需要獲取各種型號手機系統相冊圖片和視頻刪除后保存的位置 2 分析 1)我們可以通過在sdcard目錄下進行相關查找文件夾關鍵字,對 "cycle"或者"trash"或者*galle*進行忽略大小寫模糊查詢都有文件夾 find . -iname *cycle* find . -iname *trash*…

WPF 實現水珠效果按鈕組

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/8041928.html相關知識這部分基本就是廢話,網上都能找到,我只不過是整理了以下.建議先不看,用到的時候可以回來看看貝…

GetDisplayName 獲取枚舉的顯示值

item.State.GetDisplayName(), 轉載于:https://www.cnblogs.com/zhongku/p/4944315.html

組策略管理——軟件限制策略(4)

編寫軟件限制規則 在前面幾篇文章中講了軟件限制規則的基本概念&#xff0c;現在就來學習如何編寫自定義軟件限制策略。 編寫規則應遵循的原則 首先&#xff0c;需要大家注意的是&#xff0c;軟件限制策略應本著方便、安全、實用的原則來編寫。限制規則靈活方便&#xff0c;自定…

我使用 html 反向輸出自己打自己(7)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…