一、課程介紹
很多網站為了實現推送技術,所用的技術都是 Ajax 輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,然后由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
HTML5 定義的 WebSocket 協議,能更好的節省服務器資源和帶寬,並且能夠更實時地進行通訊。
今天我們要通過使用ASP.Net Core WebSocket技術來實現服務端向客戶端實時推送消息(Real-Push-Message)。
一句話總結今天我們實現的目標?
如何在ASP.NET Core中使用WebSocket技術來實現服務端向指定的客戶端實時推送消息。
廢話不多說,直接上干貨,我們不生產干貨,我們只是干貨的搬運工。
二、WebSocket介紹
WebSocket是HTML5中的協議,支持持久連接;而Http協議不支持持久連接。
WebSocket是HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。

三、ASP.NET Core基於WebSocket實現消息推送實戰演練
ASP.NET Core 中的 WebSocket 支持 | Microsoft Docs
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1
使用步驟:
1、配置中間件
安裝 Microsoft.AspNetCore.WebSockets 包。
在 Startup 類的 Configure 方法中添加 WebSocket 中間件:
app.UseWebSockets();
可配置以下設置:
KeepAliveInterval - 向客戶端發送“ping”幀的頻率,以確保代理保持連接處於打開狀態。
ReceiveBufferSize - 用於接收數據的緩沖區的大小。 高級用戶可能需要對其進行更改,以便根據數據大小調整性能。
var webSocketOptions =new WebSocketOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(120),
ReceiveBufferSize =4*1024};
};
app.UseWebSockets(webSocketOptions);
2、接受 WebSocket 請求

3、ASP.NET Core中WebSocket接收消息
配置在請求生命周期(例如在UseRouting和UseEndpoints中間),檢查它是否是 WebSocket 請求並接受 WebSocket 請求。
AcceptWebSocketAsync 方法將 TCP 連接升級到 WebSocket 連接,並提供 WebSocket 對象。 使用 WebSocket 對象發送和接收消息。
WebSocket 請求可以來自任何 URL,但此示例代碼只接受 /messagePushHub路徑的請求。
4、ASP.NET Core中WebSocket發送消息




四、總結
在ASP.NET Core中對於大多數應用程序實現實時通訊的花,現在我們建議使用 SignalR,而不是原始 WebSocket。並且在大多數情況下,與使用原始 WebSocket 相比,SignalR 沒有顯著的性能缺點。
ASP.NET Core SignalR 是一個庫,可用於簡化向應用添加實時 Web 功能,它會優先盡可能地使用 WebSocket技術。SignalR 可為 WebSocket 不可用的環境提供傳輸回退。 它還可提供簡單的遠程過程調用應用模型。
如果大家感興趣, 可以學習一下阿笨的《ASP.NET Core基於SignalR實現消息推送實戰演練》課程。