Rate this post

Microsoft в .NET 10 представила одну из самых интересных функций — Server-Sent Events (SSE). Эта возможность позволяет передавать события напрямую с сервера клиенту без использования WebSockets, SignalR или вебхуков. Для разработчиков API и веб-приложений это может значительно упростить реализацию потоковой передачи данных в реальном времени.

Что такое Server-Sent Events?

Server-Sent Events (SSE) позволяют серверу отправлять обновления клиенту через один HTTP GET-запрос. Обмен данными односторонний: информация идёт только от сервера к клиенту.

Это особенно полезно для таких сценариев, как:

  • Биржевые тикеры и финансовые данные в реальном времени

  • Отслеживание заказов в e-commerce

  • Уведомления и ленты активности

  • Онлайн-дашборды и мониторинги

Реализация SSE в .NET 10

Рассмотрим простой пример с minimal API в .NET 10. Мы создадим эндпоинт /live-orders, который будет передавать клиентам новые заказы в реальном времени.

Шаг 1: Определяем эндпоинт

app.MapGet("/live-orders", async (HttpContext context, CancellationToken token) => { var orders = GetOrdersAsync(token); return Results.Extensions.ServerSentEvents(orders); });

Здесь вместо стандартного JSON мы возвращаем server-sent events.

Шаг 2: Создаём поток данных

Используем IAsyncEnumerable, чтобы постоянно генерировать и передавать объекты заказа:

async IAsyncEnumerable<SseItem<FoodOrder>> GetOrdersAsync( [EnumeratorCancellation] CancellationToken cancellationToken) { var generator = new OrderGenerator(); while (!cancellationToken.IsCancellationRequested) { await Task.Delay(2000, cancellationToken); yield return new SseItem<FoodOrder>( data: generator.CreateOrder(), eventId: Guid.NewGuid().ToString(), eventType: "order", retry: TimeSpan.FromMinutes(1) ); } }

Каждый SseItem содержит:

  • Data (в нашем случае — FoodOrder)

  • Event ID

  • Тип события (чтобы клиент мог фильтровать события)

  • Интервал повторного подключения (если соединение оборвётся)

Шаг 3: Подключение в браузере

Современные браузеры поддерживают SSE через API EventSource. Достаточно нескольких строк JavaScript:

const eventSource = new EventSource("/live-orders"); eventSource.addEventListener("order", (event) => { const order = JSON.parse(event.data); const list = document.getElementById("orders"); const item = document.createElement("li"); item.textContent = `${order.name} - $${order.price}`; list.appendChild(item); }); eventSource.onerror = (error) => { console.error("Ошибка соединения:", error); };

Подключение автоматически восстановится, если соединение прервётся.

Почему SSE, а не WebSockets или SignalR?

Хотя WebSockets и SignalR поддерживают двустороннюю коммуникацию, во многих случаях нужна только передача данных от сервера к клиенту.

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

  • Простота — работает поверх HTTP, без дополнительных библиотек

  • Лёгкость — меньше накладных расходов, чем у WebSockets

  • Поддержка браузерами — работает «из коробки»

  • Надёжность — автоматическое переподключение при обрыве

Для случаев, где нужна только односторонняя передача данных, SSE — отличное решение.

Итоги

Новая функция Server-Sent Events в .NET 10 делает разработку приложений с обновлениями в реальном времени проще и эффективнее. Она идеально подходит для финансовых дашбордов, систем заказов или уведомлений.

SSE — это лёгкая альтернатива SignalR и WebSockets, когда двустороннее взаимодействие не требуется.

А теперь главный вопрос: Собираетесь ли вы заменить часть своих решений на WebSockets или SignalR с помощью SSE в .NET 10?