5/5 - (1 vote)

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?