Base solution for your next web application
Open Closed

SignalR The ConnectionId is in the incorrect format #5226


User avatar
0
devkev2403 created

I am running ABP MVC .Net Core on a web farm behind a load balancer. I use SignalR for notifications. After logging in attempts are made to initiate a SignalR connection. In the browser dev tools you can see the activity:

/signalr/connect?transport=serverSentEvents&clientProtocol=1.5&connectionToken=xxx&connectionData=%5B%7B%22name%22%3A%22abpcommonhub%22%7D%2C%7B%22name%22%3A%22chathub%22%7D%5D&tid=6

However, this gives a 400 with the following error: The ConnectionId is in the incorrect format.

Following advice from other sources:
I have shared .NET Core data protection keys in Redis.
IIS has defined machine keys so these are the same on all servers.
The app pools are set to run as the same domain user.

Can you help me discover what I have missed please.

Thanks


5 Answer(s)
  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    Have you followed this document to integrate SignalR into your project <a class="postlink" href="https://aspnetboilerplate.com/Pages/Documents/SignalR-AspNetCore-Integration">https://aspnetboilerplate.com/Pages/Doc ... ntegration</a> ? Becasue .NET Core version of AspNet Zero doesn't have SignalR yet.

  • User Avatar
    0
    devkev2403 created

    Thank you for your reply.

    I am actually using Abp.Web.SignalR. The ASP.NET Zero template I am using is version 2.2.2.

    SIgnalR itself works, except when load balanced. This is how I configure SignalR:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                //Initializes ABP framework.
                app.UseAbp(options =>
                {
                    options.UseAbpRequestLocalization = false; //used below: UseAbpRequestLocalization
                });
    
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseStatusCodePagesWithRedirects("~/Error?statusCode={0}");
                    app.UseExceptionHandler("/Error");
                }
    
                app.UseAuthentication();
                app.UseJwtTokenMiddleware();
    
                if (bool.Parse(_appConfiguration["IdentityServer:IsEnabled"]))
                {
                    app.UseIdentityServer();
                }
    
                app.UseStaticFiles();
                app.UseAbpRequestLocalization();
    
    #if FEATURE_SIGNALR
                //Integrate to OWIN
                app.UseAppBuilder(ConfigureOwinServices);
    #endif
    
                app.UseSession();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "defaultWithArea",
                        template: "{area}/{controller=Home}/{action=Index}/{id?}");
    
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
                });
            }
    
    #if (FEATURE_SIGNALR)
            private void ConfigureOwinServices(IAppBuilder app)
            {
                app.Properties["host.AppName"] = "MyApp";
                app.UseAbp();
    
                //added based on this https://github.com/aspnetboilerplate/aspnetboilerplate/issues/1962
                GlobalHost.DependencyResolver.Register(typeof(IAssemblyLocator), () => new SignalRAssemblyLocator());
    
                // configure SignalR to use Redis backplane
                GlobalHost.DependencyResolver.UseRedis(_appConfiguration.GetRedisConnectionString(), 6379, "", "MyQueue");
                app.MapSignalR();
    
            }
    
  • User Avatar
    0
    ismcagdas created
    Support Team

    @devkev2403 probably the problem is related to SignalR itself.
    Have you searched it on the web ?

  • User Avatar
    0
    devkev2403 created

    @ismcagdas

    Yes, I have spent quite a lot of time on this issue. I have done a lot of research and as per my previous post I have:

    Put data protection keys in Redis (not sure SignalR uses them)
    Made machine keys the same on both servers
    Have the app pool on both servers running as the same user

    I'm not sure where the problem lies - just wondered if you have any ideas?

    I will keep investigating.

  • User Avatar
    0
    ismcagdas created
    Support Team

    Hi,

    If you haven't seen this, Microsoft has an official document <a class="postlink" href="https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis">https://docs.microsoft.com/en-us/aspnet ... with-redis</a>.
    It might help you.