You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询C#创建纯WebSocket服务器的简易可扩展实现方案

嘿,我明白你的需求——想要一个不依赖额外前端库、上手像Web API一样简单,同时还能扩展的C# WebSocket方案对吧?先给你澄清个误区哈:现在的SignalR早就不依赖jQuery了!不过我懂你想要更“原生”、更轻量化方案的心情,毕竟原生应用里能少点依赖就少点麻烦。下面给你推荐两个最贴合需求的方案:

纯C#创建简单可扩展WebSocket服务器的方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:22:27