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 中调用引用,然后就完成了。
我在通过 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 中调用引用,然后就完成了。