WebSocket在C#中的应用:在.NET中创建实时应用程序

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

WebSocket in C#:在 .NET 中创建实时应用程序

现代 Web 应用程序越来越需要客户端和服务器之间的即时数据传输。传统的 HTTP 协议基于"请求-响应"机制,在更新频率和速度至关重要的场景(如聊天、在线游戏、股票行情、监控系统)中并非总是有效。这时 WebSocket 协议就派上了用场,它能建立永久的双向连接。本文将深入探讨如何在 C# (.NET) 中实现 WebSocket,创建完整的服务器和客户端,并介绍最佳实践。



什么是 WebSocket,为什么在 .NET 中需要它?

WebSocket 是一种基于 TCP 工作的协议,提供全双工通信。通过 HTTP 握手建立连接后,数据可以双向传输,无需额外开销。与长轮询或服务器发送事件不同,WebSocket 提供最低延迟和低流量。

在 .NET 生态系统中,有两种主要方法用于处理实时通信:

  • 原生 WebSocket (System.Net.WebSockets) — ASP.NET Core 中提供的底层 API。它能完全控制连接,适用于自定义协议。
  • SignalR — 微软提供的高级库,抽象了 WebSocket 并自动选择传输方式(WebSocket、SSE、长轮询)。它非常适合典型任务(聊天、通知)。

选择取决于任务:如果需要最大控制和性能,请使用原生 WebSocket;如果开发速度和简单性是优先考虑,则使用 SignalR。



在 C# (ASP.NET Core) 中创建 WebSocket 服务器

让我们一步步实现服务器。首先,创建一个 ASP.NET Core 项目(空模板或 Web API)。



第 1 步:配置中间件

在 Program.cs 文件的 Configure 方法中添加 WebSocket 支持:

var builder = WebApplication.CreateBuilder(args);var app = builder.Build();

app.UseWebSockets(); // 启用 WebSocket 支持

app.Map("/ws", async (HttpContext context) =>{ if (context.WebSockets.IsWebSocketRequest) { using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await HandleWebSocketConnection(webSocket); } else { context.Response.StatusCode = 400; }});

app.Run();

async Task HandleWebSocketConnection(WebSocket webSocket){ var buffer = new byte[1024 * 4]; while (webSocket.State == WebSocketState.Open) { var result = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None);

if (result.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync( WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } else if (result.MessageType == WebSocketMessageType.Text) { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); Console.WriteLine($"Received: {message}");

// 回显响应 var response = Encoding.UTF8.GetBytes($"Echo: {message}"); await webSocket.SendAsync( new ArraySegment<byte>(response), WebSocketMessageType.Text, true, CancellationToken.None); } }}

这段代码创建了一个回显服务器:它接收文本消息,并在消息前加上"Echo: "前缀后发回。请注意连接状态管理和关闭处理。



第 2 步:管理多个连接

在实际应用程序中,需要存储活动连接列表。使用 ConcurrentDictionary 或 ConcurrentBag:

public class WebSoc                

博客

书籍推荐