WebSocket библиотека для C# (.NET): SignalR и альтернативы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

WebSocket библиотека C# (.NET): SignalR и альтернативные инструменты для реального времени

В современной веб-разработке потребность в двусторонней связи в реальном времени стала стандартом. Чат-приложения, онлайн-игры, торговые платформы, мониторинг серверов — всё это требует мгновенной передачи данных. Для языка C# (.NET) существует несколько мощных библиотек, реализующих протокол WebSocket. В этой статье мы подробно разберём SignalR — флагманскую библиотеку от Microsoft, а также рассмотрим альтернативы: WebSocketSharp и Fleck. Вы узнаете, как выбрать подходящий инструмент и как быстро начать работу.

Что такое WebSocket и зачем он нужен в C#

WebSocket — это протокол, который обеспечивает полнодуплексную связь между клиентом и сервером через одно долгоживущее TCP-соединение. В отличие от HTTP, где клиент отправляет запрос и ждёт ответ, WebSocket позволяет серверу инициировать отправку данных в любой момент. Для платформы .NET это особенно важно, так как C# традиционно силён в серверной разработке, а WebSocket расширяет его возможности для real-time сценариев.

SignalR — официальное решение от Microsoft

SignalR — это библиотека для ASP.NET Core, которая абстрагирует работу с WebSocket, предоставляя высокоуровневый API. Она автоматически выбирает лучший транспорт: WebSocket, Server-Sent Events (SSE) или Long Polling. SignalR идеально подходит для enterprise-проектов, где важна масштабируемость и интеграция с экосистемой .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($"Эхо: {e.Data}");
    }
}

class Program
{
    static void Main()
    {
        var wsServer = new WebSocketServer("ws://localhost:8080");
        wsServer.AddWebSocketService<Echo>("/echo");
        wsServer.Start();
        Console.ReadKey();
        wsServer.Stop();
    }
}

Пример WebSocket-клиента

using WebSocketSharp;

var ws = new WebSocket("ws://localhost:8080/echo");
ws.OnMessage += (sender, e) => Console.WriteLine($"Ответ: {e.Data}");
ws.Connect();
ws.Send("Привет, сервер!");

Преимущества WebSocketSharp:

Рекомендаций