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