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

问题描述 投票:13回答:1

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

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

c# asp.net-core asp.net-core-mvc asp.net-core-1.0
1个回答
35
投票

wwwroot文件/ index.html的

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

<body>
    <script type="text/javascript">

        var source = new EventSource('sse');

        source.onmessage = function (event) {
            console.log('onmessage: ' + event.data);
        };

        source.onopen = function(event) {
            console.log('onopen');
        };

        source.onerror = function(event) {
            console.log('onerror');
        }

    </script>
</body>

中间件

中间件处理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");

            await response.Body.FlushAsync();
            await Task.Delay(5 * 1000);
        }
    }

    await next.Invoke();
});

调节器

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

[Route("/api/sse")]
public class ServerSentEventController : Controller
{
    [HttpGet]
    public async Task Get()
    {
        var response = 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

参考文献:

© www.soinside.com 2019 - 2024. All rights reserved.