当前位置: 首页 > news >正文

在 .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.lryc.cn/news/593012.html

相关文章:

  • Kotlin泛型约束
  • NLP中情感分析与观念分析、价值判断、意图识别的区别与联系,以及四者在实际应用中的协同
  • RabbitMQ—事务与消息分发
  • espidf启用vTaskList方法
  • 使用MATLAB探索圆周率π的奇妙计算之旅
  • day25 力扣90.子集II 力扣46.全排列 力扣47.全排列 II
  • bws-rs:Rust 编写的 S3 协议网关框架,支持灵活后端接入
  • VBA 运用LISTBOX插件,选择多个选项,并将选中的选项回车录入当前选中的单元格
  • 关于NUC+雷达+倍福组网交换机是否完全足够的问题(是否需要一个路由器)
  • 软考 系统架构设计师系列知识点之杂项集萃(113)
  • WPF为启动界面(Splash Screen)添加背景音乐
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
  • 标准文件和系统文件I/O
  • 车载刷写框架 --- 关于私有节点刷写失败未报引起的反思
  • 《命令行参数与环境变量:从使用到原理的全方位解析》
  • 移除debian升级后没用的垃圾
  • laravel RedisException: Connection refused优雅草PMS项目管理系统报错解决-以及Redis 详细指南-优雅草卓伊凡
  • 2025第15届上海国际生物发酵展:聚焦合成生物与绿色制造,共启生物经济新时代
  • Rust Web 全栈开发(十):编写服务器端 Web 应用
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(下)
  • 【C# in .NET】19. 探秘抽象类:具体实现与抽象契约的桥梁
  • xss的利用
  • CS231n-2017 Lecture2图像分类笔记
  • Kafka深度解析:架构、原理与应用实践
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • windows docker-02-docker 最常用的命令汇总
  • GEO营销:AI时代的搜索优化新赛道——从DeepSeek爆火看生成式引擎优化的崛起
  • Elasticsearch 重命名索引
  • LVS 集群技术实践:NAT 与 DR 模式的配置与对比
  • 牛客-倒置字符串