.net - 如何在 .net Core 3.0 中将 SignalR 添加到 Worker 服务
问题描述
我正在开发一个使用 Kafka 消息的工作人员服务。我想在检索到消息时进行 signalR 事件,但目前无法使其工作。
public static async Task Main(string[] args)
{
using (var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
services.AddTransient<IKafkaClient, KafkaClient>();
services.AddSignalR();
})
.Build())
{
// Start the host
await host.StartAsync();
// Wait for the host to shutdown
await host.WaitForShutdownAsync();
}
}
在我的工人服务中
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IKafkaClient _kafkaClient;
private readonly IHubContext<NotificationHub> _notificationHub;
public Worker(ILogger<Worker> logger,
IKafkaClient kafkaClient,
IHubContext<NotificationHub> notificationHub)
{
_logger = logger;
_kafkaClient = kafkaClient;
_notificationHub = notificationHub;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// code here
}
}
解决方案
在您的启动AddAdditionalServices
方法中添加:
services.AddSingleton<NotificationHub>()
然后将其注入您的工人阶级,如:
private readonly IServiceProvider serviceProvider;
private NotificationHub NotificationHub
{
get
{
return this.serviceProvider.GetRequiredService<NotificationsHub>();
}
}
您需要创建要从类中调用的集线器方法,例如:
public async Task BroadcastMessage(string message){
// your code here
}
所以你可以在工人中调用它。
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// code here
string message = // serialize kafka message
await NotificationHub.BroadcastMessage(message)
}
推荐阅读
- python - 我可以知道为什么我不能将垂直值组合到水平值,而它一直给我生成值的最后一个值
- android - 没有足够的信息来推断类型变量 T
- java - 已解决 - 在 Eclipse 上将动态应用程序部署到 Tomcat 服务器后,Spring Web REST API 的 HTTP 状态 404
- php - 返回要在我的自定义仪表板中显示的用户成员身份 - SHORTCODE
- python - python中的for有什么用
- python - 如何使用python从json文件中删除项目
- python - Ubuntu - 如何从外部检查 Python 程序是否正确运行
- c# - 调用远程 opencv 程序时 SSH.net 崩溃
- javascript - 我可以总是使用类组件而不使用功能组件吗?
- flutter - Flutter 使用分享意图在 youtube 上分享视频