我有一个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中创建行为以始终监听该连接并接收我可以进一步处理的事件?
我在这里找到了一个解决方案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());
}
}
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)