Javascript «EventSource» в C # .NET 5.0

#javascript #c# #wpf #.net-5 #eventsource

#javascript #c# #wpf #.net-5 #источник событий

Вопрос:

моя компания выбирает «Mercure» (https://mercure.rocks/docs/getting-started ) для управления событиями, отправляемыми сервером. Мы устанавливаем «Mercure HUB» на сервер, и теперь, в C # .NET 5.0, я должен реализовать серверную часть (издатель, который я уже реализовал) и клиентскую часть (подписчик). Подписчик должен быть выполнен с помощью WPF

На странице «начало работы» я вижу пример Javascript, который мне нужно преобразовать в C # Я не знаю, как управлять «EventSource» в C # Есть идеи?

 // The subscriber subscribes to updates for the https://example.com/users/dunglas topic
// and to any topic matching https://example.com/books/{id}
const url = new URL('https://localhost/.well-known/mercure');
url.searchParams.append('topic', 'https://example.com/books/{id}');
url.searchParams.append('topic', 'https://example.com/users/dunglas');
// The URL class is a convenient way to generate URLs such as https://localhost/.well-known/mercure?topic=https://example.com/books/{id}amp;topic=https://example.com/users/dunglas
const eventSource = new EventSource(url);
// The callback will be called every time an update is published
eventSource.onmessage = e => console.log(e); // do something with the payload
 

Комментарии:

1. Вы имеете в виду, что хотите, чтобы клиент C # прослушивал события вместо клиента браузера? Или это потому, что вы используете Blazor? Или что? В вашем объяснении отсутствует контекст, а также неясно, какие усилия вы сами приложили к этому, если вообще приложили. например makolyte.com /… выглядит интересно. Вы что-нибудь искали?

2. Спасибо, я добавил некоторую информацию в исходное сообщение. Я провел некоторое исследование и попытался создать GetAsync для подписки на некоторые события, и теперь я попробовал ваше предложение, но ничего не работает. Когда я выполнил этот асинхронный вызов, кажется, что страница WPF застряла в цикле вызова, и я больше ничего не могу сделать

3. Итак, это WPF … это нам немного помогает. Но вам нужно показать нам код, который вы пробовали, чтобы мы могли понять, в чем может быть проблема. Возможно, вам нужно переложить работу по прослушиванию событий, например, на фоновую рабочую задачу.

4. По моей вине я управляю новым потоком, и теперь ваше предложение работает! Большое вам спасибо

5. Нет проблем. Если вы решили эту проблему, пожалуйста, добавьте свое кодовое решение ниже с кратким объяснением для пользы других (и для вашей пользы тоже, если это привлечет внимание) — спасибо. Этот сайт гораздо полезнее, когда к вопросам также прилагаются ответы!

Ответ №1:

Код этой страницы работает (https://makolyte.com/event-driven-dotnet-how-to-consume-an-sse-endpoint-with-httpclient /)

 static async Task Main(string[] args)
{
    HttpClient client = new HttpClient();
    client.Timeout = TimeSpan.FromSeconds(5);
    string stockSymbol = "VTSAX";
    string url = $"http://localhost:9000/stockpriceupdates/{stockSymbol}";

    while (true)
    {
        try
        {
            Console.WriteLine("Establishing connection");
            using (var streamReader = new StreamReader(await client.GetStreamAsync(url)))
            {
                while (!streamReader.EndOfStream)
                {
                    var message = await streamReader.ReadLineAsync();
                    Console.WriteLine($"Received price update: {message}");
                }
            }
        }
        catch(Exception ex)
        {
            //Here you can check for 
            //specific types of errors before continuing
            //Since this is a simple example, i'm always going to retry
            Console.WriteLine($"Error: {ex.Message}");
            Console.WriteLine("Retrying in 5 seconds");
            await Task.Delay(TimeSpan.FromSeconds(5));
        }
    }
}