ASPNET核心服务器发送事件/响应刷新

虽然没有官方文档,但是有谁知道如何使用ASP.NET Core实现SSE?

我怀疑一个实现可能会使用自定义中间件,但也许可以在控制器操作中执行此操作?

wwwroot文件/ index.html的

在页面加载时,为http://www.somehost.ca/sse url创建一个EventSource 。 然后将其事件写入控制台。

    

中间件

中间件处理sse路径。 它将Content-Type标头设置为text/event-stream ,服务器套接字事件需要该标头。 它写入响应流,而不关闭连接。 它通过在写入之间延迟五秒来模仿工作。

 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(); }); 

调节器

控制器完成与中间件完全相同的操作。

 [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); } } } 

Firefox中的控制台输出

这是Firefox控制台窗口中的结果。 每五秒钟就有一条新消息到来。

 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 

参考文献:

  • 以上GitHub上的示例
  • HTML Living Standard,第9.2节服务器发送的事件
  • 维基百科上的Http Push技术
  • 分块传输编码