在 UWP 中接收服务器发送的事件 (SSE)

Receive Server Sent Events (SSE) in UWP

我有一个 ASP.net 核心 3.1 服务器项目,它有一个非常简单的 API 发送单向服务器发送事件 (SSE),如下所示:

[HttpGet]
public async Task Get()
{
    var response = Response;
    response.Headers.Add("Content-Type", "text/event-stream");
    response.Headers.Add("Cache-Control", "no-cache");
    response.Headers.Add("Connection", "keep-alive");

    for (var i = 0; true; ++i)
    {
        await response.WriteAsync($"id: unique{i}\n");
        await response.WriteAsync("event: add\n");
        //await response.WriteAsync("retry: 10000\n");
        await response.WriteAsync($"data: Controller {i} at {DateTime.Now}\n\n");

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

现在我想通过 C# UWP 客户端接收这些事件。不幸的是我只收到第一个事件:

using (var client = new HttpClient())
{
    using (var stream = await client.GetStreamAsync("http://localhost:5000/api/subscription"))
    {
        using (var reader = new StreamReader(stream))
        {
            while (true)
            {
                Console.WriteLine(reader.ReadLine());
            }
        }
    }
}

如何在 UWP 中创建一个行为,以便始终监听该连接并接收我可以进一步处理的事件?

HttpClient从发起请求开始,到收到服务器返回的数据结束。

这相当于只提出一个请求。如果你想在应用程序和服务器之间建立一个连续的数据传输通道,尝试使用WebSocket

这里有一个使用WebSocket的代码示例供参考:WebSocket sample


另外,使用Visual Studio调试时,可以访问localhost,但是在发布应用时,UWP会因为local network loopback

无法访问localhost

谢谢。

我在这里找到了解决方案 https://techblog.dorogin.com/server-sent-event-aspnet-core-a42dc9b9ffa9。 诀窍是不要像问题中那样设置连续 returns 数据的 WebAPI 调用,而是创建具有 MIME 类型 text/event-stream.

的数据流

在 UWP 客户端,您可以像这样读取流:

var stream = httpClient.GetStreamAsync(requestUri).Result;

using (var reader = new StreamReader(stream))
{
    while (!reader.EndOfStream)
    {
        Debug.WriteLine(reader.ReadLine());
    }
}