咨询C#创建纯WebSocket服务器的简易可扩展实现方案
嘿,我明白你的需求——想要一个不依赖额外前端库、上手像Web API一样简单,同时还能扩展的C# WebSocket方案对吧?先给你澄清个误区哈:现在的SignalR早就不依赖jQuery了!不过我懂你想要更“原生”、更轻量化方案的心情,毕竟原生应用里能少点依赖就少点麻烦。下面给你推荐两个最贴合需求的方案:
1. ASP.NET Core 原生WebSocket支持(最贴合Web API上手体验)
如果你已经在用ASP.NET Core Web API,这个方案简直无缝衔接——不需要额外安装重型框架,ASP.NET Core本身就内置了WebSocket支持,底层已经帮你搞定了RFC规范和TCP监听的细节,你只需要关注业务逻辑就行。
举个极简的Minimal API示例:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 注册一个处理WebSocket的端点 app.Map("/ws", async context => { // 判断请求是否是WebSocket连接 if (!context.WebSockets.IsWebSocketRequest) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // 接受WebSocket连接 using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var buffer = new byte[1024 * 4]; // 循环接收消息 WebSocketReceiveResult result; do { result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); // 处理收到的消息,比如广播给其他连接、返回响应 await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); } while (!result.CloseStatus.HasValue); // 关闭连接 await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }); app.Run("http://localhost:5000");
这个代码和你写Web API的Minimal端点几乎一样,上手成本极低。而且它天生支持ASP.NET Core的所有扩展能力:比如依赖注入、日志、中间件,你可以轻松把WebSocket的连接管理、消息路由等逻辑封装成服务,实现可扩展性。
2. WebSocketSharp-netstandard(轻量第三方库)
如果想要更轻量化、甚至可以脱离ASP.NET Core环境运行的服务器,WebSocketSharp-netstandard是个不错的选择。这个库把WebSocket的底层逻辑封装得非常简洁,API直观,就像写普通网络服务一样简单。
先通过NuGet安装WebSocketSharp-netstandard,然后写个最简服务器:
using WebSocketSharp; using WebSocketSharp.Server; // 自定义一个WebSocket服务类 public class ChatService : WebSocketBehavior { protected override void OnMessage(MessageEventArgs e) { // 收到消息后广播给所有连接的客户端 Sessions.Broadcast(e.Data); } } // 创建并启动服务器 var wssv = new WebSocketServer("ws://localhost:5000"); wssv.AddWebSocketService<ChatService>("/chat"); wssv.Start(); Console.WriteLine("WebSocket server running on ws://localhost:5000/chat"); Console.ReadLine(); wssv.Stop();
这个方案的优点是轻量、独立,不需要依赖ASP.NET Core的整套框架,适合小型服务或者需要单独部署WebSocket服务器的场景。而且它自带会话管理、广播功能,扩展起来也很方便——你可以重写OnOpen、OnClose等方法处理连接生命周期,或者自定义消息处理逻辑。
为什么不推荐自己写TCP监听器?
你提到的那些需要手动处理TCP连接、实现RFC规范的示例,确实太繁琐了——WebSocket协议本身有握手、帧解析、心跳等细节,自己实现很容易踩坑,维护成本极高。上面的两个方案都已经帮你封装了这些底层逻辑,让你能像写Web API一样专注于业务代码,同时还保证了可扩展性。
最后再提一句:如果之后发现需要更高级的功能(比如自动重连、分组广播、跨平台支持),其实现在的SignalR也是个很好的选择,它现在完全不依赖jQuery,原生应用(比如Xamarin、MAUI)里集成也很顺畅,不过如果你的需求就是“纯”WebSocket,上面两个方案绝对够用。
内容的提问来源于stack exchange,提问作者Scarabas

