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?