#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));
}
}
}