【问题标题】:Receive Server Sent Events (SSE) in UWP在 UWP 中接收服务器发送事件 (SSE)
【发布时间】:2020-04-11 14:00:45
【问题描述】:

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

【问题讨论】:

    标签: c# uwp server-sent-events


    【解决方案1】:

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

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

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


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

    谢谢。

    【讨论】:

    • 我从 WebSocket 示例链接中尝试了 WebSocket,我得到了一个 ArgumentException,说 WebSocket-URI 必须匹配模式“ws://”或“wss://”,即显然没有,因为我没有在服务器端实现 WebSocket(我不想这样做)。
    • 对于常见的TCP请求,请求由客户端发起,服务器接受请求并响应。从你的问题描述来看,你希望服务端不断的返回数据,这就需要服务端和客户端之间的双向通道。 WebSocket 是一种解决方案,但这需要服务器进行调整。如果不想调整服务端的代码,可以考虑给客户端加个定时器(比如DispatcherTimer)定时请求内容,但不推荐这种方式。
    • 在大多数情况下你是对的,但我的意思是客户端订阅 SSE 是单向的,而不是 WebSocket(解释如下:smashingmagazine.com/2018/02/sse-websockets-data-flow-http2)。我在这里找到了我的解决方案:techblog.dorogin.com/server-sent-event-aspnet-core-a42dc9b9ffa9
    • 很高兴您解决了这个问题,这是一个非常有用的解决方案。您可以写下您的解决方案并将其标记为答案,这将帮助更多有相同问题的人。
    【解决方案2】:

    我在这里找到了解决方案https://techblog.dorogin.com/server-sent-event-aspnet-core-a42dc9b9ffa9。 诀窍是不要设置像问题中那样连续返回数据的 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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多