在 .NET Core 中創建 Web Socket API

要在 ASP.NET Core 中創建 WebSocket API,您可以按照以下步驟操作:

設置新的 ASP.NET Core 項目

打開 Visual Studio 或您喜歡的 IDE。
創建一個新的 ASP.NET Core Web 應用程序項目。
選擇API模板,因為這將成為您的 WebSocket API 的基礎。

在啟動時添加 WebSocket 支持

打開Startup.cs(或Program.cs在 .NET 6 或更高版本中)。
在Configure方法中,通過調用添加 WebSocket 支持 UseWebSockets()。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}

? ? // Enable WebSocket support
var webSocketOptions = new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromSeconds(120),
ReceiveBufferSize = 4096
};
app.UseWebSockets(webSocketOptions);

? ? app.UseRouting();

? ? app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

創建 WebSocket 處理程序

創建將處理 WebSocket 連接的新服務或類。
public class WebSocketHandler
{
private readonly WebSocket _webSocket;

? ? public WebSocketHandler(WebSocket webSocket)
{
_webSocket = webSocket;
}

? ? public async Task HandleWebSocketAsync(CancellationToken cancellationToken)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result;
do
{
result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// Process message or forward it
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", cancellationToken);
}
} while (!cancellationToken.IsCancellationRequested);
}
}

創建 WebSocket 控制器

在您的Controllers文件夾中,創建一個監聽 WebSocket 連接的新控制器。
[ApiController]
[Route("api/[controller]")]
public class WebSocketController : ControllerBase
{
private readonly WebSocketHandler _webSocketHandler;

? ? public WebSocketController(WebSocketHandler webSocketHandler)
{
_webSocketHandler = webSocketHandler;
}

? ? [HttpGet("connect")]
public async Task<IActionResult> Connect(CancellationToken cancellationToken)
{
if (!HttpContext.WebSockets.IsWebSocketRequest)
{
return BadRequest("WebSocket request expected");
}

? ? ? ? var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await _webSocketHandler.HandleWebSocketAsync(cancellationToken);

? ? ? ? return Ok();
}
}

配置依賴注入

在Startup.cs(或Program.cs在 .NET 6 中)將其注冊 WebSocketHandler為服務。
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<WebSocketHandler>();
services.AddControllers();
}

處理 WebSocket 消息

在您的 中WebSocketHandler,您可以添加邏輯來處理 WebSocket 消息。這包括讀取、發送和處理不同類型的消息。
例如,在HandleWebSocketAsync方法中:

if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// Send a response back to the client
var response = Encoding.UTF8.GetBytes($"You said: {message}");
await _webSocket.SendAsync(new ArraySegment<byte>(response), WebSocketMessageType.Text, true, cancellationToken);
}

運行應用程序

現在,運行您的應用程序。您可以使用 WebSocket 客戶端(例如 Postman、WebSocket 測試工具)或瀏覽器中的自定義 JavaScript 客戶端來測試 WebSocket API。

使用 JavaScript 測試 WebSocket

您可以使用 JavaScript 測試您的 WebSocket API,如下所示:

const socket = new WebSocket('ws://localhost:5000/api/websocket/connect');

socket.onopen = () => {
console.log('WebSocket connection established');
socket.send('Hello WebSocket Server!');
};

socket.onmessage = (event) => {
console.log('Message from server:', event.data);
};

socket.onclose = () => {
console.log('WebSocket connection closed');
};

處理錯誤和超時

為 WebSocket 邏輯添加適當的錯誤處理。處理客戶端斷開連接或超時等情況。
確保處理入站和出站消息場景。

完成這些步驟后,您已在 ASP.NET Core 中創建了一個 WebSocket API!這允許您在客戶端(例如,瀏覽器或移動應用程序)和服務器之間發送和接收實時數據。

如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。?

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

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

相關文章

Python 之地址編碼識別

根據輸入地址&#xff0c;利用已有的地址編碼文件&#xff0c;構造處理規則策略識別地址的編碼。 lib/address.json 地址編碼文件&#xff08;這個文件太大&#xff0c;博客里放不下&#xff0c;需要的話可以到 gitcode 倉庫獲取&#xff1a;https://gitcode.com/TomorrowAndT…

kafka的部署

目錄 一、kafka簡介 1.1、概述 1.2、消息系統介紹 1.3、點對點消息傳遞模式 1.4、發布-訂閱消息傳遞模式 二、kafka術語解釋 2.1、結構概述 2.2、broker 2.3、topic 2.4、producer 2.5、consumer 2.6、consumer group 2.7、leader 2.8、follower 2.9、partition…

小語種OCR識別技術實現原理

小語種OCR&#xff08;光學字符識別&#xff09;技術的實現原理涉及計算機視覺、自然語言處理&#xff08;NLP&#xff09;和深度學習等多個領域的融合&#xff0c;其核心目標是讓計算機能夠準確識別并理解不同語言的印刷或手寫文本。以下是其關鍵技術實現原理的詳細解析&#…

GPT:讓機器擁有“創造力”的語言引擎

當ChatGPT寫出莎士比亞風格的十四行詩&#xff0c;當GitHub Copilot自動生成編程代碼&#xff0c;背后都源于同一項革命性技術——**GPT&#xff08;Generative Pre-trained Transformer&#xff09;**。今天&#xff0c;我們將揭開這項“語言魔術”背后的科學原理&#xff01;…

LeetCode|Day19|14. 最長公共前綴|Python刷題筆記

LeetCode&#xff5c;Day19&#xff5c;14. 最長公共前綴&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;14. 最長公共前綴 難度&#xff1a;簡單…

安全事件響應分析--基礎命令

----萬能密碼oror1 or # 1or11 1 or 11安全事件響應分析------***windoes***------方法開機啟動有無異常文件 【開始】?【運行】?【msconfig】文件排查 各個盤下的temp(tmp)相關目錄下查看有無異常文件 &#xff1a;Windows產生的 臨時文件 可以通過查看日志且通過篩…

基于C#+SQL Server實現(Web)學生選課管理系統

學生選課管理系統的設計與開發一、項目背景學生選課管理系統是一個學校不可缺少的部分&#xff0c;傳統的人工管理檔案的方式存在著很多的缺點&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以開發一套綜合教務系統管理軟件很有必要&#xff0c;它應該具有傳統的…

垃圾回收(GC)

內存管理策略&#xff0c;在業務進程運行的過程中&#xff0c;由垃圾收集器以類似守護協程的方式在后臺運行&#xff0c;按照指定策略回收不再被使用的對象&#xff0c;釋放內存空間進行回收 優勢&#xff1a; 屏蔽內存回收的細節&#xff1a;屏蔽復雜的內存管理工作&#xff0…

Datawhale AI夏令營-機器學習

比賽簡介 「用戶新增預測挑戰賽」是由科大訊飛主辦的一項數據科學競賽&#xff0c;旨在通過機器學習方法預測用戶是否為新增用戶 比賽屬于二分類任務&#xff0c;評價指標采用F1分數&#xff0c;分數越高表示模型性能越好。 如果你有一份帶標簽的表格型數據&#xff0c;只要…

Spring IOC容器在Web環境中是如何啟動的(源碼級剖析)?

文章目錄一、Web 環境中的 Spring MVC 框架二、Web 應用部署描述配置傳統配置&#xff08;web.xml&#xff09;&#xff1a;Java配置類&#xff08;Servlet 3.0&#xff09;&#xff1a;三、核心啟動流程詳解1. 啟動流程圖2. ★容器初始化入口&#xff1a;ContextLoaderListene…

18個優質Qt開源項目匯總

1&#xff0c;Clementine Music Player Clementine Music Player 是一個功能完善、跨平臺的開源音樂播放器&#xff0c;非常適合用于學習如何開發媒體類應用&#xff0c;尤其是跨平臺桌面應用。它基于 Qt 框架開發&#xff0c;支持多種操作系統&#xff0c;包括 Windows、macO…

計算機視覺:AI 的 “眼睛” 如何看懂世界?

1. 什么是計算機視覺&#xff1a;讓機器 “看見” 并 “理解” 的技術1.1 計算機視覺的核心目標計算機視覺&#xff08;CV&#xff09;是人工智能的一個重要分支&#xff0c;它讓計算機能夠 “看懂” 圖像和視頻 —— 不僅能捕捉像素信息&#xff0c;還能分析內容、提取語義&am…

華為OD刷題記錄

華為OD刷題記錄 刷過的題 入門 1、進制 2、NC61 doing 訂閱專欄

QT學習教程(二十五)

雙緩沖技術&#xff08;Double Buffering&#xff09;&#xff08; 2、公有函數實現&#xff09;#include <QtGui> #include <cmath> using namespace std; #include "plotter.h"以上代碼為文件的開頭&#xff0c;在這里把std 的名空間加入到當前的全…

設計模式筆記_結構型_裝飾器模式

1.裝飾器模式介紹裝飾器模式是一種結構型設計模式&#xff0c;允許你動態地給對象添加行為&#xff0c;而無需修改其代碼。它的核心思想是將對象放入一個“包裝器”中&#xff0c;這個包裝器提供了額外的功能&#xff0c;同時保持原有對象的接口不變。想象一下&#xff0c;你有…

day25 力扣90.子集II 力扣46.全排列 力扣47.全排列 II

子集II給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。數組中可能含有重復元素&#xff0c;如出現兩個整數相等&#xff0c;也可以視作遞增序列的一種特殊情況。示例 1&…

Solidity 中的`bytes`

在 Solidity 中&#xff0c;bytes 和 bytes32 都是用來保存二進制數據的類型&#xff0c;但它們的長度、使用場景、Gas 成本完全不同。? 一句話區分類型一句話總結bytes32定長 32 字節&#xff0c;適合做哈希、地址、標識符等固定長度數據。bytes動態長度字節數組&#xff0c;…

初學者STM32—PWM驅動電機與舵機

一、簡介 上一節課主要學習了輸出比較和PWM的基本原理和結構&#xff0c;本節課就主要以實踐為主通過STM32最小系統板和驅動器控制舵機和直流電機。 上一節課的坐標 初學者STM32—輸出比較與PWM-CSDN博客 二、舵機 舵機是一種根據輸入PWM信號占空比來控制輸出角度的裝置 輸…

C++中的異常處理機制:try-catch

一、基本概念 異常&#xff08;Exception&#xff09;&#xff1a;程序執行過程中發生的非正常情況&#xff0c;比如除以零、訪問越界、內存不足等。 異常處理&#xff08;Exception Handling&#xff09;&#xff1a;對異常情況進行捕獲、分析&#xff0c;并采取補救措施&…

如何從 Windows 11 或 10 遠程訪問 Ubuntu 24.04 或 22.04 桌面

了解如何使用 RDP(遠程桌面協議)從 Windows 11 或 10 遠程連接 Ubuntu 24.04 Noble 或 22.04 LTS Jammy JellyFish 桌面的步驟。 Windows 提供了一個便捷的功能,稱為遠程桌面連接,它使用 RDP 協議來遠程連接 PC。當從 Windows 系統建立遠程桌面連接時,使用起來非常簡單,…