Использование SignalR в проекте Worker ServiceC#

Место общения программистов C#
Ответить
Anonymous
 Использование SignalR в проекте Worker Service

Сообщение Anonymous »

Я долго и тщательно искал, как это правильно настроить, но у меня ничего не получалось.
В основном я следил за следующей статьей Microsoft и корректировал свои настройки мои собственные потребности по мере продвижения.
Использование .Net 5.0
Для начала я пытаюсь создать SignalR связь между моим веб-интерфейсом и моим BackgroundService. При создании фоновой службы я использовал шаблон Файл -> Новый проект -> Рабочая служба для создания этой службы. Мне нужно иметь возможность отправлять данные клиентам и получать данные от клиентов в рамках BackgroundService.
Program.cs
Здесь добавляю SignalR. Это кажется довольно простым.

Код: Выделить всё

 public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
IConfiguration configuration = hostContext.Configuration;
services.AddDbContext(options =>
options.UseSqlServer(configuration.GetConnectionString("myContext")));
services.AddSignalR();
services.AddHostedService();
});
}
Интерфейс:
Здесь мое понимание начинает ухудшаться. Я думаю это интерфейс для отправки данных клиенту?

Код: Выделить всё

public interface IDesoutterController
{
Task SendData(DateTime currentTime);
}
Контроллер-хаб:
Вот мой хаб, содержащийся в проекте рабочей службы, с функцией отправки данных всем клиентов.

Код: Выделить всё

public class ControllerHub : Hub
{
public async Task SendDataToClients(DateTime dateTime)
{
await Clients.All.SendData(dateTime);
}
}
Клиент Controller Hub:
Это меня больше всего смущает. Почему мой сервис использует концентратор и клиент-концентратор в данном случае или это все плохая формулировка? Это только часть для получения данных из моего веб-интерфейса? Будет ли мой проект веб-интерфейса вызывать конечную точку /hubs/controller??

Код: Выделить всё

public partial class ControllerHubClient : IDesoutterController, IHostedService
{
private readonly ILogger _logger;
private HubConnection _connection;

public ControllerHubClient(ILogger logger)
{
_logger = logger;

_connection = new HubConnectionBuilder()
.WithUrl("/hubs/controller")
.Build();

_connection.On("onSend", SendData);
}
public async Task StartAsync(CancellationToken cancellationToken)
{
// Loop is here to wait until the server is running
while (true)
{
try
{
await _connection.StartAsync(cancellationToken);

break;
}
catch
{
await Task.Delay(1000);
}
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
return _connection.StopAsync();
}
public Task SendData(DateTime currentTime)
{
_logger.LogInformation("{CurrentTime}", currentTime.ToShortTimeString());

return Task.CompletedTask;
}
}
Рабочая служба:

Код: Выделить всё

 public class Worker : BackgroundService
{
private readonly ILogger _logger;
private readonly IHubContext _controllerHub;
public Worker(ILogger logger, IHubContext controllerHub)
{
_logger = logger;
_controllerHub = controllerHub;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//Other Stuff
}
}
}
На самом деле все, что я пытаюсь сделать, это установить соединение SignalR между веб-интерфейсом и проектом Worker Service, чтобы разрешить отправку событий (быстро). Каждому экземпляру моей фоновой службы нужен собственный концентратор. Конечно, я ДОВОЛЬНО уверен, что делаю все неправильно. Однако я получаю следующую ошибку всякий раз, когда запускаю свой проект рабочей службы.

System.TypeLoadException: 'Метод 'GetStreamItemType' в типе 'Microsoft.AspNetCore.SignalR .Internal.DefaultHubDispatcher`1" из сборки "Microsoft.AspNetCore.SignalR.Core, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" не имеет реализации.'

Буду очень признателен за любую помощь или указания, поскольку я совершенно новичок в фоновых службах и сигнализаторах.
РЕДАКТИРОВАТЬ
Вот схема системы, которую я пытаюсь создать. Прочитав некоторые комментарии, я хотел уточнить, что в моем проекте Worker Service НЕТ start.cs (большая часть того, почему я был сбит с толку, читая статью Microsoft). Думаю, потому что я использовал шаблон рабочей службы? В моем случае я «думаю», что пытался поместить и клиента, и концентратор в один проект. После еще одного предложения в комментарии я считаю, что мне бы хотелось использовать концентратор в своем проекте веб-интерфейса и сделать мою фоновую службу клиентом, подключающимся к концентратору?
Итак, картинка переключить пользовательский интерфейс на Hub, а фоновые рабочие службы на клиентские? Когда я говорю «рабочие службы», я имею в виду, что создаю задачу для каждого устройства. Таким образом, на каждое устройство приходится 1 «рабочий» поток.
Изображение
< /п>

Подробнее здесь: https://stackoverflow.com/questions/693 ... ce-project
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»