最近剛開始使用ASP .NET Core,
需要在服務端建立三個WebSocket連線,
抑或稱為需要三個不同通道的連線用以區別不同的來源。
參考GitHub還有許多網路資源如下:
https://gitee.com/ikende/BeetleX(這個似乎不是用原生Kestrel建立的WebServer,不曉得能不能像中間件那樣注入到pipeline內)
https://www.google.com.tw/amp/s/codingnote.cc/zh-tw/p/124183/amp/ 真的很少有用ASP .NET Core(pipeline)建立多頻道WebSocket的範例。
目前主要是參考了以下文章建立?
https://radu-matei.com/blog/aspnet-core-websockets-middleware/
但是僅支援多通道,不曉得單純這樣寫效能會不會很差。
想請版友推薦高併發量且支援多channel的open source或是提供一點設計多通道的思路,謝謝:)
uj5u.com熱心網友回復:
??正常情況我們不會選擇3個,我們只會寫路由,寫hub,寫訊息處理
我也懶得找資料隨便搜一篇
https://blog.csdn.net/sD7O95O/article/details/94415540
ps:你都知道channel了,還在乎原始是幾個么? 假設我的訪問是 ws://xxxxxxxx/channel1 你認為如何?
uj5u.com熱心網友回復:
至于性能,基本上我只能說“少看博客園”-------看的越多,你們越不會寫代碼目前的博客園已經被其他的語言給攻陷了?why,因為就是那波整天血案來,string去滴性能,讓博客園neter反胃,讓他們自己內卷去吧。真正的neter還是需要尊重實際,少折騰“血案”--------那些寫血案的,到不是血案,那是因為他們自己不尊重實際,既然不尊重實際,非要故意飛天遁地,那么摔死很正常
uj5u.com熱心網友回復:
看文章看本質邏輯你發的
https://radu-matei.com/blog/aspnet-core-websockets-middleware/
本身說
app.MapWebSocketManager("/ws", serviceProvider.GetService<NotificationsMessageHandler>());
那么我們們說,既然有/ws 就可以有/ws1,/ws2
既然有NotificationsMessageHandler 就可以有NotificationsMessageHandler 1,NotificationsMessageHandler 2
所以理解人家本身想干啥,比整天跟那個園子血案來,string去要有意義
uj5u.com熱心網友回復:
我看到網上SignalR的範例用法都是寫Hub,原來WebSocket也可以嗎?
另外以我目前參考的範例來看,
因為ConnectionManager是建立成AddTransient,似乎我只要另外建立一個類似ChatMessageHandler的類別,並且在Startup.cs內map它(如下),是不是就可以了@@?
app.MapWebSocketManager("/ws", serviceProvider.GetService<TestMessageHandler>());
uj5u.com熱心網友回復:
看問題,看本質app.MapWebSocketManager("/ws", serviceProvider.GetService<TestMessageHandler>());
app.MapWebSocketManager("/ws1", serviceProvider.GetService<TestMessageHandler1>());
這樣是可以的
同樣還是看問題,看本質Kestrel到底是什么,Kestrel本質上只是一個sokect服務器,只是內建了http,ws協議決議。而且他們公用相同的埠。
所以本質上他就是1個,默認就1個。沒有你說的多個。他就只有1個,你所有的訪問只是通過一個決議路徑,一個pipeline,一個map路由分配。
通用他從來就沒有多個,既然是sokect服務器,我們當然知道。本質上就是開啟一個監聽。連上一個就是一個基于套接字的通道。所以他本質上就沒有1個多個的說法
在回頭說,你要所謂性能。你要性能,怎么要。所有的人都是通過一個埠,一個pipeline,一個路由,所以你覺著這么多人公用一個性能不高??
好吧,我敗給你們。你要多個,可以。那么我們開啟多個埠監聽
o.ListenAnyIP(1883, l => l.UseMyWebSockect());
o.ListenAnyIP(1884, l => l.UseMyWebSockect());
是的,我們可以寫個UseMyWebSockect連接擴展,告訴他1883,1884單獨監聽,并使用MyWebSockect處理,這樣就可以達到你要求的,不跟別人公用相同的資源。
只是我個人說,基本沒必要
uj5u.com熱心網友回復:
謝謝您的回覆,發上面那個文時,用手機看的,還沒看到您的其他更新的回覆,所以才會發上面的文。
我等等就來試試看~~~ 感謝您:)
uj5u.com熱心網友回復:
.UseKestrel(o =>{
o.ListenAnyIP(1883, l => l.UseMyWebSockect());
o.ListenAnyIP(1884, l => l.UseMyWebSockect())
})
uj5u.com熱心網友回復:
剛剛試了可以哦,謝謝:)
當我把相同程式碼移至dll(另一個專案)時,另外用一個主程式呼叫此「專案參考」,依賴注入也沒報錯,
不過用相同工具要連接時卻無法連接,感覺像是連線逾時,等了很久才回覆,路由如果刻意打錯的話(非/ws),會立刻回傳錯誤。
像這類的故障要怎麼排除或查找呢? 再麻煩解惑了。

uj5u.com熱心網友回復:
更正一下文章內容,刻意打錯url為「/ws123」的話,也是會逾時的。像是這路由不存在似的@@uj5u.com熱心網友回復:
就算我把WebSocket Middleware相關的數據挪到main專案下,這個問題依舊會發生?我主要是參考下述的代碼。
https://github.com/anjoy8/Blog.Core
用了AutoFac、統一回傳介面、SqlSugar和(Sevice,Extension,Repository分開)的部份。
但應該不會影響到路由才對?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/243068.html
標籤:ASP.NET
