如何在 ASP.NET Core 中使用 WebSocket
在現代 Web 應用程序中,WebSocket 連接非常流行且使用率極高。它可以幫助企業滿足數字環境需求,并處理來自最終用戶的實時數據。它還能提升生產力、輸出率和用戶體驗。
如果您還沒有使用 WebSocket,那么您應該開始在 ASP.NET Core 應用程序中使用它。它將幫助您在這個充滿活力的市場中實現預期的業務成果。要了解其實現方式,請進一步探索提供的流程。
ASP.NET Core 應用程序中的 WebSocket 是什么?
在 ASP.NET Core 應用程序中,Web Sockets 啟用了一種在服務器和客戶端之間建立低開銷通信的協議。它允許服務器-客戶端架構中的設備持續通信,直到其中一方關閉連接。
在實時應用中,WebSocket 起著主要作用,因為它們使服務器能夠接收持續更新的數據。這種連接本質上是雙向的,并且需要 HTTP 支持才能實現穩定性、性能和速度。
何時在 ASP.NET Core 項目中實現 WebSocket 連接功能?
只有符合以下要求或用例時,才應在 ASP.NET Web API 應用程序和其他應用程序中實現 WebSockets。
?? ?? 開發實時應用程序,如聊天室、金融科技或企業系統。
? 構建一個在線游戲應用程序,其中服務器接收不斷的客戶端更新。
? 當您需要刷新 UI 而用戶沒有要求時。
? 用于構建供內部、部門內或建筑物內使用的聊天應用程序。
? 創建用于實時股票和股份交易的外匯和交易系統。
同樣,您可以確定您的需求是否屬于這些場景。為了更好地澄清,請咨詢.NET 開發公司或聘請 .NET Core 開發人員。
深入了解 ASP.NET Core 應用程序中的 Web Sockets:一個實際示例
在這里,我們將學習 ASP.NET Core 項目中 WebSocket 的功能。完成本教程后,您將了解 ASP.NET Web API 應用程序的 WebSocket 通信配置的基礎知識。
首先,下載、安裝并打開最新版本的 Visual Studio IDE。本教程將使用 .NET 6.0 框架。您可以使用更高版本,但在實施之前,請檢查其對協議的支持情況。
該過程分為三個主要階段,概述如下:
?? ?? 第 1 階段:服務器端配置
? 第 2 階段:客戶端配置
? 第 3 階段:測試 WebSockets 通信
讓我們從過程開始。
階段 1:服務器端配置
?? ?? 步驟 1:在 Visual Studio IDE 中,創建一個空的 ASP.NET Core 項目,使用 C#作為其主要編程語言。
在每個項目設置屏幕上,您都會在右下角找到“下一步/創建”按鈕。填寫詳細信息并選擇可靠的選項后,點擊該按鈕繼續操作。
步驟 2:在“配置新項目”屏幕上,根據您的需求填寫項目詳細信息。在本教程中,我們使用“ SimpleWS-Server ”作為項目和解決方案名稱。
步驟 3:在“附加信息”屏幕上,選擇.NET 6.0,其余設置保持不變。確保所有設置與以下代碼片段中的設置一致。
步驟 4:項目生成后,您將在“解決方案資源管理器”選項卡中看到其所有關聯文件。此外,它將顯示如下所示的默認 Hello World 代碼。您必須將app.Run ()方法替換為 app.RunAsync()。
步驟 5:現在,我們將添加UseWebSockets()函數和builder.WebHost.UserUrls()方法。
該函數將使我們的應用程序能夠使用 WebSocket 通信。該方法將有助于定義服務器的端口和 URL,在本例中為“ http://localhost:6969 ” 。
步驟 6:在 WebSocket 函數之后,配置服務器的端點映射。我們將使用app.Map()方法,并將 WebSocket 路由設置為“ ws ”。此外,我們還將在同一方法中添加上下文。
步驟 7:應用程序中的上下文。需要配置map ()方法。在其中,我們將添加僅接受/允許 WebSocket 通信的邏輯。
為此,您必須添加 context.WebSockets.IsWebSocketRequest檢查。如果請求是 Web 套接字,ASP.NET Core 應用程序將接受它;否則,將發送 400 錯誤(錯誤請求)。
步驟8:一旦應用程序確認這是一個Web套接字連接,它就應該為其定義一個實例。為此,請添加以下代碼。
using var ws = await context.WebSockets.AcceptWebSocketAsync();?
該實例將有助于使用ws.State驗證當前連接狀態。
在上面的代碼片段中,您可以看到 Web Socket 可以經歷的所有七種連接狀態。每個狀態都有一個對應的值,用于確定當前狀態。
步驟9:要使服務器能夠發送消息,請使用WebSocket 實例上的SendAsync()方法。它接受以下參數。
?? ?? ArraySegment<byte>
? WebSocketMessageType enum
? Bool endofMessage
? CancelationToken
所有這些參數都需要轉換為字節數組,從而生成ArraySegment<byte>并向客戶端發送消息。
var message = "Hello World!";
var bytes = Encoding.UTF8.GetBytes(message);
var arraySegment = new ArraySegment<byte>(bytes, 0, bytes.Length);
await ws.SendAsync(arraySegment,
WebSocketMessageType.Text,
true,
CancellationToken.None);?
步驟 10:為了讓 WebSocket 服務器以“ HH:MM:SS ”格式返回當前時間給客戶端,請將以下邏輯包裝在 while(true) 循環中,如下所示。該邏輯還使用Thread.Sleep(1000)函數將進程延遲 1 秒。
此外,代碼將驗證 WebSocket 連接狀態,僅當檢測到打開狀態時才發送消息。
到這里,服務器端配置就完成了。我們的 WebSockets 服務器已經準備好了。
階段 2:客戶端配置
讓我們創建 WebSocket 客戶端。
步驟 1:打開您的 Visual IDE以使用 C# 作為編程語言創建 .NET 控制臺應用程序。
步驟 2:填寫項目詳細信息。在本教程中,我們使用SimpleWS-Client作為解決方案和項目名稱。
步驟 3: 選擇.NET 6.0框架并創建項目。
步驟 4:為了使客戶端設備能夠啟動 Web 套接字連接,我們將使用System.Net.WebScokets提供的ClientWebSocket。
using System.Net.WebSockets;
var ws = new ClientWebSocket();?
步驟 5:要連接WebSockets服務器,請使用以下代碼塊。它包含帶有取消令牌和URL的ConnectAsync方法。
await ws.ConnectAsync(new Uri("ws://localhost:6969/ws"), CancellationToken.None);?
步驟 6:編寫代碼,讓客戶端在連接狀態變為alive后接收來自服務器的消息。
步驟 7:為了接收來自 WebSockets 服務器的消息,我們將RecieveAsync()方法添加到客戶端代碼庫。它將使客戶端設備能夠接受取消令牌和ArraySegment<byte>。
此外,您還將創建一個字節數組緩沖區來生成 ArraySegment<byte>。
步驟 8:使用上述所有代碼,我們的結果仍然是字節數組格式。但是,我們希望它顯示為字符串。因此,我們必須使用Encoding.UTF8.GetString()方法實現編碼。
另外,添加以下代碼來檢查連接是否未關閉。
result.MessageType == WebSocketMessageType.Close
步驟 9: 檢查代碼。確保最終的客戶端代碼與以下內容相同。
步驟 10: 測試 WebSockets 服務器和客戶端的功能。首先運行服務器項目,然后運行客戶端項目。如果顯示當前時間(HH:MM:SS)格式,則表示配置成功。
到目前為止,我們已經針對一個客戶端測試了 WebSockets 項目。但是在實際場景中,可能會有多個最終用戶。因此,在下一階段,我們將測試它處理多個 WebSocket 通信的能力。
階段 3:測試 WebSockets 通信
為了測試多個 WebSocket 連接,我們將創建并使用一個聊天室應用程序。它將包含以下功能:
?? ?? 連接多個用戶并為他們創建實例。
? 要求每個用戶輸入他們的用戶名/姓名。
? 廣播聊天室、加入和離開通知。
? 聊天室中每個用戶接收和發送消息。
? 通過檢查 WebSocket 連接狀態來刪除客戶端實例。
與前兩個階段的配置類似,我們將首先編寫服務器的代碼,然后編寫客戶端的代碼。
服務器代碼
您的完整服務器代碼將是以下代碼庫。
讓我們分解一下代碼。首先,你會找到代碼的用途,以及它下面執行該過程的代碼部分。
用于跟蹤多個 WebSocket連接。
為了向每個最終用戶/客戶端廣播消息,使用SendAsync()方法。
用于模擬聊天室并廣播新連接客戶端的用戶名。
為了管理消息接收過程,將使用類似于客戶端配置的RecieveAsync() 方法。
在WS 處理中調用 ReceiveMessage() 函數。
為了在聊天室中廣播收到的消息,使用Action<WebSocketReceiveResult, byte[]> handleMessage修改了 ReceiveMessage() 函數。
此外,我們修改了 ReceiveMessage 調用,使 lambda 函數能夠通過。此外,我們還將在 lambda 函數中添加邏輯,以便將一個用戶的消息廣播給聊天室中所有其他用戶。
下面的代碼用于跟蹤離開聊天室的用戶。它檢測 WebSocket 狀態以確定客戶端是否存在。
客戶端代碼
在客戶端添加以下代碼塊用于輸入用戶名。
使用以下代碼向服務器發送消息,該消息隨后將在聊天室中廣播。這里,將在 ClientWebSocket 實例上使用 SendAsync() 方法。
要管理退出聊天室的客戶端,請使用以下代碼。它將告訴應用程序刪除該特定客戶端的 WebSocket 實例。
現在客戶端代碼已經完成,只剩下測試部分。
要測試聊天室應用程序,請運行服務器和客戶端項目。如果看到“用戶加入房間”消息,則表示ASP.NET Core 應用運行成功。
現在,創建另一個客戶端實例,以驗證服務器是否正在檢測并廣播新的用戶加入通知。輸出將類似于以下內容。
進一步,從第二個實例發送消息并持續監視第一個客戶端接收消息。
現在,關閉第二個實例的連接并打開一個新客戶端(第三個客戶端)。
類似地,您可以發送消息、添加新客戶端、刪除當前客戶端以及廣播消息來測試 ASP.NET Core WebSockets 應用程序。
總結 ASP.NET Core 中的 WebSockets
實時應用程序廣泛使用 WebSocket,在服務器-客戶端架構中提供雙向通信。要實現它,您首先應該選擇正確的用例,正如本博客中所述。此外,您可以按照提供的步驟了解其實現方式。
如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。?