TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #3032 2.49K
День 2520. #ЗаметкиНаПолях
Разбираем Server-Sent Events в
ASP.NET Core и .NET 10. Продолжение
Начало

Обработка пропущенных событий
У простой конечной точки, которую мы создали ранее, есть один недостаток: ей не хватает отказоустойчивости.

Одна из самых больших проблем с потоками в реальном времени — это разрывы соединения. К тому времени, когда браузер автоматически переподключится, несколько событий могут быть уже отправлены и потеряны. Для решения этой проблемы в SSE есть встроенный механизм: заголовок Last-Event-ID. Когда браузер переподключается, он отправляет этот ID обратно на сервер.

В .NET 10 мы можем использовать тип SseItem<T> для добавления метаданных к нашим данным (идентификаторы и интервалы повторных попыток).

Можно создать простой буфер OrderEventBuffer в памяти, содержащий объекты типа SseItem<OrderPlacement>, и методом получения всех объектов после Last-Event-ID, который будет предоставляться браузером. Так мы можем «воспроизвести» пропущенные сообщения при переподключении:
app.MapGet("orders/realtime/with-replays", (
ChannelReader<OrderPlacement> reader,
OrderEventBuffer buffer,
[FromHeader(Name = "Last-Event-ID")]
string? lastEventId,
CancellationToken ct) =>
{
async IAsyncEnumerable<SseItem<OrderPlacement>>
StreamEvents()
{
// Повторяем пропущенные события
if (!string.IsNullOrWhiteSpace(lastEventId))
{
var missed = buffer.GetEventsAfter(lastEventId);
foreach (var m in missed)
yield return m;
}

// Выдаём события по мере их поступления в канал
await foreach (var order in
reader.ReadAllAsync(ct))
{
// Буфер назначает уникальный ID
var sseItem = buffer.Add(order);
yield return sseItem;
}
}

return TypedResults.ServerSentEvents(
StreamEvents(), "orders");
});


Окончание следует…

Источник:
https://www.milanjovanovic.tech/blog/server-sent-events-in-aspnetcore-and-dotnet-10
  • 👍 19
More from @netdeveloperdiary
  1. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  2. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  3. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  4. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  5. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  6. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →