Server-Sent Events (SSE): Comunicação em Tempo Real com C# de Forma Simples e Eficiente

Conteúdo

Introdução: O Problema das Atualizações em Tempo Real

Imagine que você está construindo um painel de monitoramento, um sistema de notificações ou um feed de notícias em tempo real. O backend precisa avisar o frontend assim que algo relevante acontecer. Como resolver isso de forma eficiente e sem complicação?

Muitos desenvolvedores recorrem, por hábito, ao polling: o cliente pergunta ao servidor a cada intervalo se há algo novo. Outros tentam WebSockets, mas logo percebem que a bidirecionalidade e a sobrecarga de gerenciamento podem ser desnecessários em casos simples.

Server-Sent Events (SSE) surgem aqui como uma solução elegante. Eles permitem que o servidor empurre atualizações em tempo real para o navegador, de forma nativa, simples e eficiente — sem a complexidade dos WebSockets e sem o desperdício do polling.

Neste artigo você vai aprender:

✅ O que são SSEs e como funcionam.
✅ Vantagens e desvantagens práticas.
✅ Casos de uso ideais.
✅ Como implementar Server-Sent Events em C# com ASP.NET Core com exemplos claros.

O que são Server-Sent Events (SSE)?

Server-Sent Events (SSE) é uma tecnologia baseada em HTTP que permite ao servidor enviar atualizações em tempo real para o cliente por meio de uma conexão persistente. Diferente do polling ou do long-polling, onde o cliente inicia a comunicação repetidamente, no SSE a conexão é aberta uma vez e mantida aberta.

Enquanto os WebSockets oferecem comunicação bidirecional (cliente ↔ servidor), o SSE é unidirecional: apenas o servidor envia dados para o cliente. Isso simplifica bastante a arquitetura para cenários onde o cliente só precisa ouvir.

Como Funciona?

  • O cliente faz uma requisição HTTP normal.

  • O servidor responde com o content type text/event-stream.

  • A conexão permanece aberta enquanto o servidor envia dados periodicamente.

  • O cliente, usando EventSource, exibe essas informações em tempo real.

Principais Características do SSE

✅ Comunicação Unidirecional

Fluxo de dados apenas do servidor para o cliente, ideal para notificações e atualizações contínuas.

✅ Reconexão Automática

O próprio EventSource tenta reconectar automaticamente caso a conexão caia.

✅ Eventos Nomeados

O servidor pode enviar diferentes tipos de eventos, permitindo ao cliente tratá-los de forma independente.

✅ Simplicidade

Extremamente simples de implementar, sem necessidade de bibliotecas externas ou protocolos complicados.

Vantagens do Uso de Server-Sent Events

  • Eficiência: Mais leve e eficiente que polling tradicional.

  • Facilidade de Implementação: Menos complexo que WebSockets para casos unidirecionais.

  • Compatibilidade HTTP: Funciona com infraestrutura existente (load balancers, proxies, etc).

  • Suporte Nativo nos Navegadores: Chrome, Firefox, Safari e Edge suportam EventSource nativamente.


Desvantagens e Limitações

  • Unidirecional: Não serve para troca de mensagens interativas cliente-servidor.

  • Limite de Conexões: Alguns navegadores limitam conexões simultâneas por domínio.

  • Formato de Texto: Apenas texto (UTF-8). Para dados binários, WebSockets seria necessário.


Cenários de Uso Ideais para SSE

✔️ Notificações em Tempo Real: Novas mensagens, alertas de sistema.
✔️ Feeds de Atualizações: Esportes ao vivo, mercado financeiro, notícias.
✔️ Dashboards: Métricas de servidores, status de sistemas.
✔️ Progresso de Tarefas: Uploads, renderização, processamento de arquivos.

Implementando Server-Sent Events com C# e ASP.NET Core

Backend: ASP.NET Core Controller

Um exemplo simples: criar um endpoint que envia a hora atual a cada segundo.

1️⃣ Crie o Controller:

				
					using Microsoft.AspNetCore.Mvc;
using System.Text;
using System.Threading.Channels;

[ApiController]
[Route("sse")]
public class SseController : ControllerBase
{
    [HttpGet("time")]
    public async Task GetTime()
    {
        Response.Headers.Add("Content-Type", "text/event-stream");
        Response.Headers.Add("Cache-Control", "no-cache");
        Response.Headers.Add("Connection", "keep-alive");

        while (!HttpContext.RequestAborted.IsCancellationRequested)
        {
            var data = $"data: {DateTime.UtcNow:HH:mm:ss}\n\n";
            var bytes = Encoding.UTF8.GetBytes(data);
            await Response.Body.WriteAsync(bytes);
            await Response.Body.FlushAsync();
            await Task.Delay(1000);
        }
    }
}

				
			

Detalhes Importantes:

  • text/event-stream: Tipo de conteúdo obrigatório.

  • data: prefixo obrigatório para enviar dados.

  • \n\n finaliza cada mensagem.

  • Reconexão automática em caso de falha.

 

Frontend: JavaScript com EventSource

				
					<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Exemplo SSE</title>
</head>
<body>
    <h1>Hora do Servidor</h1>
    <div id="time"></div>

    <script>
        const source = new EventSource("/sse/time");

        source.onmessage = function (event) {
            document.getElementById("time").textContent = event.data;
        };

        source.addEventListener("update", function(event) {
            console.log("Evento nomeado recebido:", event.data);
        });

        source.onerror = function () {
            console.log("Erro ou desconexão. Tentando reconectar...");
        };
    </script>
<script>window.w3tc_lazyload=1,window.lazyLoadOptions={elements_selector:".lazy",callback_loaded:function(t){var e;try{e=new CustomEvent("w3tc_lazyload_loaded",{detail:{e:t}})}catch(a){(e=document.createEvent("CustomEvent")).initCustomEvent("w3tc_lazyload_loaded",!1,!1,{e:t})}window.dispatchEvent(e)}}</script><script async src="http://vilarim.info/home/wp-content/plugins/w3-total-cache/pub/js/lazyload.min.js"></script></body>
</html>

				
			

Comparativo Prático: SSE vs WebSockets vs Polling

Critério SSE WebSockets Polling Tradicional
Direção Servidor → Cliente Bidirecional Cliente → Servidor
Complexidade Baixa Alta (gerenciamento manual) Muito simples, porém ineficiente
Escalabilidade Boa (HTTP infra) Complexa (infra específica) Péssima em larga escala
Casos Ideais Notificações, feeds, dashboards Chats, games, interações em tempo real Quando não há opção melhor

Dicas de Boas Práticas

✅ Sempre inclua cabeçalhos Cache-Control: no-cache.
✅ Utilize CancellationToken para encerrar conexões de forma limpa.
✅ Se necessário, implemente controle de heartbeat (pings periódicos).

Conclusão

O Server-Sent Events é uma tecnologia subestimada, mas extremamente útil para comunicação unidirecional em tempo real. Quando você precisa que seu servidor avise seu cliente de forma simples e eficiente, sem a complexidade dos WebSockets, o SSE é uma excelente escolha.

Com suporte nativo em navegadores e integração natural com o ASP.NET Core, você pode entregar experiências em tempo real com muito menos dor de cabeça.

Se ficou alguma dúvida ou você quer compartilhar seu caso de uso, comente abaixo! 🚀