SignalR 客户端不通过 Masstransit 接收消息

SignalR client does not receive message through Masstransit

我在通过 MassTransit 和 SignalR 向客户端发送消息时遇到问题

启动:

        //SignalR
        services.AddSignalR().AddMassTransitBackplane();     
        #region MassTransit RabbitMq

        services.AddScoped<SendCosistListToScaleConsumer>();
        services.AddScoped<CreateConsistListConsumer>();

        services.AddMassTransit(x => 
        {
            x.AddSignalRHubConsumers<NotifyHub>();

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(conf =>
            {
                conf.Host(Configuration["Rabbit:Host"], host => {
                    host.Username(Configuration["Rabbit:Username"]);
                    host.Password(Configuration["Rabbit:Password"]);
                });                   

               conf.ReceiveEndpoint(Configuration["Rabbit:ReceiveEndpoint"], e => {
                    e.PrefetchCount = 16;
                    e.UseMessageRetry(n => n.Interval(3, 100));

                    #region Consumers
                    e.Consumer<SendCosistListToScaleConsumer>();
                    e.Consumer<CreateConsistListConsumer>();
                   #endregion
               });
                conf.AddSignalRHubEndpoints<NotifyHub>(provider);
            }));
        });
        services.AddMassTransitHostedService();
        #endregion

....

app.UseSignalR(endpoints =>
{
    endpoints.MapHub<NotifyHub>("/notify");
});

消费者:

public class CreateConsistListConsumer : IConsumer<ICreateConsistList>
    {
        IReadOnlyList<IHubProtocol> protocols = new IHubProtocol[] { new JsonHubProtocol() };
        public Task Consume(ConsumeContext<ICreateConsistList> context)
        {
            context.Publish<All<NotifyHub>>(
               new
               {
                   Message = protocols.ToProtocolDictionary("SendMessageToAllUsers", new object[] { "CompanyId", context.Message.CompanyId })
               });
            return Task.CompletedTask;
        }
    }

控制台应用程序(SignalR 客户端):

   hubConnection.On<Object>("SendMessageToAllUsers", param => {
        Console.WriteLine(param);
     });

如果我正确理解 MassTransii 和 SignalR 的工作原理,那么这段代码足以向客户端发送消息。 在调试的帮助下,我发现 CreateConsistListConsumer 正在运行,但客户端没有收到报告。 同时,客户端连接到集线器并正确接收来自其他来源的消息,但不是来自 MassTransit。

我做错了什么?

上周我也遇到了同样的问题。

似乎 SignalR 在处理集线器方面做了一些特殊的工作,无法使 Masstransit SignalR 服务正常工作。

我最终使用了静态集线器参考,如 here 所述。

基本上,我只是调用 Core DI 来获取我的集线器上下文,然后将其存储到静态 属性 中(如上面列出的 Github 问题中的示例)。

需要时,我从我的 MassTransit Consumer 中调用引用,然后就完成了。