gpt4 book ai didi

c# - 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub

转载 作者:行者123 更新时间:2023-12-01 23:34:45 24 4
gpt4 key购买 nike

我正在处理一个使用 ASP.NET Core 2.2 构建的项目。主要解决方案包含多个项目,其中包括API、Web和其他类库。

我们使用 SignalR 来显示 API 项目和 Web 项目之间的共享消息/通知。例如,从 API 添加新员工记录应调用 SignalR Hub,并且所有 Web 客户端都应收到通知。

这是我们项目的当前结构

|- API
|- Hub_ClassLibrary
|- Services
|- Web

流量:

Web > services > Hub 
API > services > Hub

中心:

public class NotificationHub : Hub
{
public async Task SendNotification(List<DocumentHistoryModel> notifications)
{
await Clients.All.SendAsync(Constants.ReceiveNotification, notifications);
}
}

网络启动类:

app.UseSignalR(routes =>
{
routes.MapHub<NotificationHub>("/notificationHub");
});

API启动类

app.UseSignalR(routes =>
{
routes.MapHub<NotificationHub>("/notificationHub");
});

服务

private readonly IHubContext<NotificationHub> _hubContext;

public MyService(IHubContext<NotificationHub> hubContext)
{
_hubContext = hubContext;
}

await _hubContext.Clients.All.SendAsync(ReceiveNotification, notifications);

问题是,我可以从 web 发送和接收通知,但是从 api 调用,web 没有收到任何通知。我认为问题是它为每个项目创建两个单独的连接,但是处理这种情况的最佳方法是什么?

编辑:我可以在此 api 代码中获取连接 ID 和状态“已连接”,但是,网络仍然没有收到任何通知。还尝试了connection.InvokeAsync

var connection = new HubConnectionBuilder()
.WithUrl("https://localhost:44330/notificationhub")
.Build();

connection.StartAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
}
else
{
connection.SendAsync("UpdateDashboardCount", "hello world");
}
}).Wait();

enter image description here

最佳答案

对于这种情况,您最好使用发布/订阅系统,例如rabbitmq、kafka、akka.net、redis。但是,如果您坚持使用信号器,最好的解决方案是使用信号器创建一个消息协调器,并将其设为信号器主机,然后您的其他服务将充当客户端,将消息发送到该信号器服务并从中接收消息(您甚至可能需要实现一些逻辑来使您的按摩协调器对消息进行排队并使它们持久化)此外,如果您可以迁移到 asp.net core 3,您也应该检查 grpc 双向流,这可以完美解决您的问题。

关于c# - 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com