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.
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.
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.
Fluxo de dados apenas do servidor para o cliente, ideal para notificações e atualizações contínuas.
O próprio EventSource tenta reconectar automaticamente caso a conexão caia.
O servidor pode enviar diferentes tipos de eventos, permitindo ao cliente tratá-los de forma independente.
Extremamente simples de implementar, sem necessidade de bibliotecas externas ou protocolos complicados.
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.
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.
✔️ 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.
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);
}
}
}
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.
Exemplo SSE
Hora do Servidor
| 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 |
✅ 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).
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! 🚀