Задать вопрос
@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);
        }
    }
}
  • Вопрос задан
  • 158 просмотров
Подписаться 2 Простой 5 комментариев
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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