Задать вопрос
@andrey71
админю и учу C#, ASP.NET Core

Передача сообщения через SignalR. Как сделать однократное соединение с сервером?

Добрый день! Прошу вашего совета в таком моменте : существует приложение web api (.NET Core 3.1), которое при получении данных должно отобразить сообщение на сайте с помощью SignalR. Технически у меня всё получилось, но реализация мне не нравится, т.к. соединение с сервером где находится хаб устанавливается каждый раз.
Как правильно сделать, что бы соединение устанавливалось однократно при запуске приложения web api?

Спасибо!

public class SendToSignalR
{
    HubConnection connection;

    public SendToSignalR()
    {
        try
        {
            connection = new HubConnectionBuilder()
                 .WithUrl("http://localhost:5176/chat")
                 .Build();
            Console.WriteLine("Connect to signalr");

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
    public async Task SendMessage(string message)
    {
        try
        {
            await connection.StartAsync();
            await connection.InvokeAsync("Broadcast", message);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}
  • Вопрос задан
  • 209 просмотров
Подписаться 2 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • OTUS
    C# Developer. Professional
    6 месяцев
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 1
    1 неделя
    Далее
  • Software-testing.ru
    Программирование на C# для тестировщиков
    10 недель
    Далее
Решения вопроса 1
Lapish72
@Lapish72
Нет примера вызова методов из вашего класса, но могу предположить, что вы каждый раз инициализируете его. Вам нужно сделать ваш класс Singleton'ом. Для этого в Startup ConfigureServices зарегистрируйте ваш сервис:
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ВашСервис>();
    }
}

И затем в Program:
public class Program
{
    public static async Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        var service = host.Services.GetRequiredService<ВашСервис>();
        service.ConnectToServer(); //Подключаемся к SignalR

        host.Run();
    }
}


UPD:
Советую поменять название класса на более общее, например, SignalrService, а метод SendToSignalR на Connect.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы