- ABP Framework version: v3.0.4
- UI type: Angular
- DB provider: EF Core
- Tiered (MVC) or Identity Server Separated (Angular): yes
- Exception message and stack trace:
- Steps to reproduce the issue:
We have AWS hosting and the SingleR AbpHub is hosted in multiple ECS containers. The SignalR Redis backplane uses the pub/sub feature to forward messages to other servers. could you please help on how to enble radis backplane in ABP SignalR.
16 Answer(s)
-
0
hi
Have you tried the steps on this document?
https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-5.0
Configure
ISignalRServerBuilder
in module.public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.AddStackExchangeRedis("connectionString", options => { options.Configuration.ChannelPrefix = "MyApp"; }); }); }
-
0
i didnt try steps given in microsoft documnet as it required install Microsoft.AspNetCore.SignalR.StackExchangeRedis and add config setp services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
But i tried your suggeted preconfig in my appservice module but it didnt worked in AWS ECS. please find below current config and let me know, if anything else is required
public override void PreConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); if (!hostingEnvironment.IsDevelopment()) { context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = configuration["Redis:Configuration"]; }); }); } }
-
0
hi
You should follow the steps and code in the document to try. If it doesn't work, please check the logs to know what's wrong.
-
0
Hi,
As per Microsoft document, we need to add services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>"); in configservices but as per ABP documement, it says that You don't need to use the services.AddSignalR() and the app.UseEndpoints(...), it's done by the AbpAspNetCoreSignalRModule. we are using AbpAspNetCoreSignalRModule module
https://docs.abp.io/en/abp/latest/SignalR-Integration
-
0
we need to add services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
Yes, but you need to configure the
ISignalRServerBuilder
.public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.AddStackExchangeRedis("connectionString", options => { options.Configuration.ChannelPrefix = "MyApp"; }); }); }
-
0
Yes, i did. here is sample code. i dont get option for AddStackExchangeRedis
public override void PreConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration(); if (!hostingEnvironment.IsDevelopment()) { context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = configuration["Redis:Configuration"]; }); }); }
}
also, do you mein i need to add services.AddSignalR().AddStackExchangeRedisCache("<your_Redis_connection_string>"); in configservice as well ?
-
0
hi
You need install the Microsoft.AspNetCore.SignalR.StackExchangeRedis package. https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.StackExchangeRedis/
Then
public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.AddStackExchangeRedis("connectionString", options => { options.Configuration.ChannelPrefix = "MyApp"; }); }); }
-
0
Hi,
I tried with given approach but no success. still facing same issue. SingalR pub/sub is working fine with single ECS container but not with multiple.
public override void PreConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); if (!hostingEnvironment.IsDevelopment()) { var redis = configuration["Redis:Configuration"]; context.Services.PreConfigure<ISignalRServerBuilder>(builder => { builder.AddStackExchangeRedis(redis, options => { options.Configuration.ChannelPrefix = "InvoiceManagement"; }); }); } }
-
0
HI
Is there any messages in the logs?
-
0
Hi,
There is no issue found in logs related to SignalR but it is not working as expected . 1 ECS container message is not getting to other container.
-
0
any logs in browser?
-
0
Hi,
there is no issue log in browser either. as said we are running this invoice service in multiple container so one only get the hub notification to the user connetced to the same container and rest users connected to other container not getting notification. this should be solve by Redis backplane but given solution is not working.
-
0
hi
I can't think of any possible reasons, we have followed Microsoft's documentation.
Can you try to use redis backplane in non-abp applications?
-
0
This question has been automatically marked as stale because it has not had recent activity.
-
1
We had the same issue after disabling "sticky" sessions on the scaled-out Azure AppService host. Appeared that SignalR protocol performs first call to negotiate protocol, then second call randomly can be sent to another node. This can be fixed by disabling negotiation on client side. This fix helped us. Please add this point to the ABP SignalR integration documentation because it makes pain for everybody who tries to scaling out the backend with use of custom Redis backplane.
const options = { skipNegotiation: true, transport: 1 // WebSockets };
https://github.com/dotnet/aspnetcore/issues/11678
-
0
Thanks petro.samoshkin