В основном я следил за следующей статьей 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);
}
}
Это меня больше всего смущает. Почему мой сервис использует концентратор и клиент-концентратор в данном случае или это все плохая формулировка? Это только часть для получения данных из моего веб-интерфейса? Будет ли мой проект веб-интерфейса вызывать конечную точку /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
}
}
}
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
Мобильная версия