Что такое SignalR в ASP.NET Core?

Ответ

SignalR — это библиотека для ASP.NET Core, которая абстрагирует сложность реализации двусторонней связи в реальном времени (real-time) между сервером и клиентами.

Ключевые особенности:

  • Автоматический выбор транспорта: SignalR на стороне клиента и сервера согласует наилучший доступный протокол: WebSockets, Server-Sent Events (SSE) или Long Polling. Разработчик пишет один API, а библиотека сама управляет транспортом.
  • Модель Hub: Основная абстракция для обмена сообщениями. Сервер определяет методы, которые могут вызывать клиенты, а клиенты — методы, которые может вызывать сервер.
  • Управление соединениями: Встроенная поддержка групп соединений, отправки сообщений конкретным клиентам или всем подключённым.

Пример серверного Hub:

public class ChatHub : Hub
{
    // Клиент вызывает этот метод
    public async Task SendMessage(string user, string message)
    {
        // Сервер рассылает сообщение ВСЕМ подключённым клиентам
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    // Можно отправлять сообщения конкретному соединению или группе
    public async Task SendPrivateMessage(string connectionId, string message)
    {
        await Clients.Client(connectionId).SendAsync("PrivateMessage", message);
    }
}

Пример клиента на JavaScript:

// Установка соединения
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

// Подписка на метод, который будет вызывать сервер
connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

// Запуск соединения и вызов серверного метода
await connection.start();
await connection.invoke("SendMessage", "Alice", "Hello World!");

Типичные сценарии: чаты, live-уведомления, обновление дашбордов, онлайн-игры.

Ответ 18+ 🔞

Давай разберемся, что это за зверь такой — SignalR. Представь, что тебе нужно, чтобы сервер мог сам, без твоего ведома, пиздануть что-то в браузер пользователя. Не по запросу, а просто потому что на сервере что-то случилось. Вот для этого эта штука и создана.

По сути своей, это такая библиотечка в ASP.NET Core, которая берёт на себя всю ебучую возню с «живым» общением между сервером и клиентами. Ты пишешь код, а она под капотом сама решает, как лучше этот разговор организовать.

Чем она хороша, блядь:

  • Умный транспорт: Ты не паришься насчёт WebSockets, Long Polling или Server-Sent Events. SignalR сам с клиентом договаривается: «О, братан, у нас тут WebSockets прёт? Нет? Ну ладно, давай тогда по-старинке, будем поллингить». И всё это — автоматически, одной строчкой кода.
  • Центр управления (Hub): Вся логика крутится вокруг этой сущности — Hub. На сервере ты объявляешь методы, которые клиенты могут вызывать. А на клиенте — подписываешься на методы, которые сервер может в тебя выстрелить. Красота, а не жизнь.
  • Кому что говорить: Можно орать на всю комнату (Clients.All), можно шептать на ушко конкретному соединению (Clients.Client(connectionId)), а можно собрать своих в группу (Groups) и вещать только им. Управление — огонь.

Вот как это выглядит на сервере, смотри:

public class ChatHub : Hub
{
    // Клиент дергает этот метод
    public async Task SendMessage(string user, string message)
    {
        // А сервер в ответ орет это сообщение ВСЕМ, кто на линии
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    // А тут можно и приватнуху отправить, если connectionId знаешь
    public async Task SendPrivateMessage(string connectionId, string message)
    {
        await Clients.Client(connectionId).SendAsync("PrivateMessage", message);
    }
}

А на клиенте (в JS) это вообще элементарно:

// Подключаемся к хабу
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub")
    .build();

// Говорим: "Слушай, если сервер вызовет метод 'ReceiveMessage' — ты мне скажи!"
connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

// Запускаем движок и дергаем серверный метод
await connection.start();
await connection.invoke("SendMessage", "Васян", "Всем чмоки в этом чате!");

Где это применить? Да где угодно, где нужна живая лента: чаты, онлайн-уведомления типа «ваш заказ доставлен», дашборды, которые сами обновляются, или даже простенькие игрушки. В общем, везде, где нужно, чтобы сервер мог тебе что-то сказать без твоего спроса. Очень удобная штука, внатуре.