Что такое SignalR в C#

SignalR — это библиотека для ASP.NET Core, позволяющая в реальном времени обмениваться данными между клиентами и сервером. Используется для создания чатов, уведомлений, мониторинга данных и других интерактивных приложений.

Основные возможности

  • Поддержка WebSockets, Server-Sent Events и Long Polling
  • Автоматическое переключение транспорта в зависимости от возможностей клиента
  • Поддержка масштабирования через Redis, Azure SignalR Service
  • Возможность работы с различными клиентами: JavaScript, .NET, Java, Python

Установка SignalR

SignalR добавляется в проект ASP.NET Core через пакет NuGet Microsoft.AspNetCore.SignalR.

Install-Package Microsoft.AspNetCore.SignalR

Создание хаба

Хаб управляет подключениями и взаимодействием между клиентами.

using Microsoft.AspNetCore.SignalR;

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

Настройка сервера

Добавление SignalR в Program.cs:

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

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<ChatHub>("/chatHub");
});

app.Run();

Подключение клиента JavaScript

Клиентское приложение подключается к хабу через SignalR JavaScript SDK.

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.5/signalr.min.js"></script>
<script>
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/chatHub")
        .build();

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

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

Вызов методов сервера с клиента

Отправка сообщения с клиента на сервер:

connection.invoke("SendMessage", "User1", "Hello, SignalR!")
    .catch(err => console.error(err));

Масштабирование SignalR

Для работы в нескольких узлах используется Redis.

builder.Services.AddSignalR().AddStackExchangeRedis("localhost:6379");

Авторизация в SignalR

SignalR поддерживает аутентификацию и авторизацию через Authorize.

[Authorize]
public class ChatHub : Hub
{
}

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