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

问题描述 投票:0回答:1

我在通过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-backplane
1个回答
0
投票

我上周也面临着同样的问题。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.