当前位置: 首页 > 知识库问答 >
问题:

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

房唯
2023-03-14

我有一个ASP。net core 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中创建行为以始终监听该连接并接收我可以进一步处理的事件?

共有2个答案

李疏珂
2023-03-14

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

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

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

using (var reader = new StreamReader(stream))
{
    while (!reader.EndOfStream)
    {
        Debug.WriteLine(reader.ReadLine());
    }
}
沈凡
2023-03-14

HttpClient以启动请求开始,在收到服务器返回的数据时结束。

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

下面是一个使用WebSocket作为参考的代码示例:WebSocket示例

此外,在使用Visual Studio进行调试时,您可以访问localhost,但在发布应用程序时,由于本地网络环回,UWP将无法访问localhost

谢谢

 类似资料:
  • 我有一个后端服务器,它将事件作为服务器发送的事件发送给客户端。我还没有找到一个好的库来在Android上处理这项技术,所以我一直在使用一种回退方法,定期检查服务器(通过访问事件endpoint)中的新事件。 后台服务每10秒执行一次。不用说,这不是最好的方法。如果没有任何开源库可用于此场景,那么在内存使用和电池消耗方面,定期检查服务器后端是否有新事件的最佳方法是什么?与在Android中管理开放式

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 当前,我已经在Express API上为服务器发送的事件设置了一个endpoint,当我从cmd调用endpoint时,使用http://localhost:3000/v1/devices,我得到了流,但当我使用新事件源从Vue应用程序调用endpoint时('http://localhost:3000/v1/devices“)但它只会继续加载,而不会流式传输任何数据。是否有我目前没有做的事情要做

  • http://Socket.io允许你触发或响应自定义的事件,除了connect,message,disconnect这些事件的名字不能使用之外,你可以触发任何自定义的事件名称。 服务器端 // 注意,io(<端口号>) 将为你创建一个http服务。 var io = require('socket.io')(80); io.on('connection', function (socket)