Получать отправленные сервером события (SSE) в UWP - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть 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 Client. К сожалению, я получаю только первое событие:

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 ]

1 голос
/ 13 апреля 2020

HttpClient начинается с инициирования запроса и заканчивается, когда он получает данные, возвращенные сервером.

Это эквивалентно выполнению только одного запроса. Если вы хотите построить непрерывный канал передачи данных между приложением и сервером, попробуйте использовать WebSocket

Вот пример кода с использованием WebSocket для справки: Пример WebSocket


Кроме того, при отладке в Visual Studio вы можете получить доступ к localhost, но при публикации приложения UWP не сможет получить доступ к localhost из-за обратной связи в локальной сети

Спасибо.

0 голосов
/ 21 апреля 2020

Я нашел решение здесь 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...