C# (.NET) WebSocket 库:SignalR 及其替代方案

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

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

开始课程

WebSocket 库 C# (.NET):SignalR 和实时通信的替代工具



在现代 Web 开发中,实时双向通信的需求已成为标准。聊天应用、在线游戏、交易平台、服务器监控——所有这些都需要即时数据传输。对于 C# (.NET) 语言,有多个强大的库实现了 WebSocket 协议。在本文中,我们将详细分析 SignalR——微软的旗舰库,并探讨替代方案:WebSocketSharp 和 Fleck。您将了解如何选择合适的工具以及如何快速开始使用。



什么是 WebSocket,为什么在 C# 中需要它

WebSocket 是一种协议,通过单个长期存在的 TCP 连接在客户端和服务器之间提供全双工通信。与客户端发送请求并等待响应的 HTTP 不同,WebSocket 允许服务器随时发起数据发送。对于 .NET 平台来说,这一点尤其重要,因为 C# 传统上在服务器端开发方面很强,而 WebSocket 扩展了其在实时场景中的能力。



SignalR——微软的官方解决方案

SignalR 是一个用于 ASP.NET Core 的库,它抽象了 WebSocket 的工作,提供了高级 API。它会自动选择最佳传输方式:WebSocket、Server-Sent Events (SSE) 或 Long Polling。SignalR 非常适合企业级项目,在这些项目中,可扩展性和与 .NET 生态系统的集成非常重要。



安装 SignalR

dotnet add package Microsoft.AspNetCore.SignalR


SignalR 简单聊天示例

创建一个 Hub——用于管理连接的中心类:

using Microsoft.AspNetCore.SignalR;

public class ChatHub : Hub{ public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); }}


在 Program.cs 中进行配置:

var builder = WebApplication.CreateBuilder(args);builder.Services.AddSignalR();

var app = builder.Build();app.MapHub<ChatHub>("/chat");

app.Run();


JavaScript 客户端:

const connection = new signalR.HubConnectionBuilder()    .withUrl("/chat")    .build();

connection.on("ReceiveMessage", (user, message) => { console.log(`${user}: ${message}`);});

connection.start().catch(err => console.error(err));


SignalR 的优点:

  • 自动选择传输方式 (WebSocket, SSE, Long Polling)
  • 支持群发和定向发送给特定用户
  • 内置断线重连处理
  • 与 ASP.NET Core Identity 身份验证集成
  • 通过 Redis Backplane 或 Azure SignalR Service 进行扩展


缺点:

  • 对于简单项目来说过于臃肿
  • 依赖 ASP.NET Core (无法在控制台应用中使用)
  • 在非标准场景下配置复杂


WebSocketSharp——适用于 .NET Framework 和 .NET Core 的轻量级库

WebSocketSharp 是一个极简主义库,它实现了 WebSocket 协议,没有多余的抽象。它适用于创建服务器端和客户端 WebSocket 连接。非常适合嵌入到控制台应用或 Unity 游戏中。



通过 NuGet 安装

dotnet add package WebSocketSharp


WebSocket 服务器示例

using WebSocketSharp;using WebSocketSharp.Server;

public class Echo : WebSocketBehavior{ protected override void OnMessage(MessageEventArgs e) { Send($"Echo: {e.Data}"); }}

class Program{ static void Main() { va

推荐