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 у браузері
Сучасні браузери підтримують 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?