ASPNET Core Server Enviado eventos / Respuesta al ras

Si bien no hay documentación oficial, ¿alguien sabe cómo se puede implementar SSE usando ASP.NET Core?

Sospecho que una implementación puede usar middleware personalizado, pero tal vez sea posible hacerlo en la acción del controlador.

wwwroot / index.html

En la carga de la página, cree un EventSource para el http://www.somehost.ca/sse url. Luego escribe sus eventos en la consola.

    

Middleware

El middleware maneja el camino sse . Establece el encabezado Content-Type en text/event-stream , que requiere el evento de socket del servidor. Escribe en el flujo de respuesta, sin cerrar la conexión. Imita hacer trabajo, demorando durante cinco segundos entre las escrituras.

 app.Use(async (context, next) => { if (context.Request.Path.ToString().Equals("/sse")) { var response = context.Response; response.Headers.Add("Content-Type", "text/event-stream"); for(var i = 0; true; ++i) { // WriteAsync requires `using Microsoft.AspNetCore.Http` await response .WriteAsync($"data: Middleware {i} at {DateTime.Now}\r\r"); response.Body.Flush(); await Task.Delay(5 * 1000); } } await next.Invoke(); }); 

Controlador

El controlador hace exactamente lo mismo que el middleware.

 [Route("/api/sse")] public class ServerSentEventController { private readonly IHttpContextAccessor _httpContextAccessor; public ServerSentEventController( IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } [HttpGet] public async Task Get() { var response = _httpContextAccessor.HttpContext.Response; response.Headers.Add("Content-Type", "text/event-stream"); for(var i = 0; true; ++i) { await response .WriteAsync($"data: Controller {i} at {DateTime.Now}\r\r"); response.Body.Flush(); await Task.Delay(5 * 1000); } } } 

Salida de consola en Firefox

Este es el resultado en la ventana de la consola de Firefox. Cada cinco segundos llega un nuevo mensaje.

 onopen onmessage: Message 0 at 4/15/2016 3:39:04 PM onmessage: Message 1 at 4/15/2016 3:39:09 PM onmessage: Message 2 at 4/15/2016 3:39:14 PM onmessage: Message 3 at 4/15/2016 3:39:19 PM onmessage: Message 4 at 4/15/2016 3:39:24 PM 

Referencias:

  • La muestra anterior en GitHub
  • El estándar de vida HTML, sección 9.2 Eventos enviados por el servidor
  • Tecnología HTTP de empuje en Wikipedia
  • Codificación de transferencia fragmentada