对于某些用户(而不是其他用户)使用WebSocket或ServerSentEvents时,SignalR给出404

对于某些用户(而不是其他用户)使用WebSocket或ServerSentEvents时,SignalR给出404,signalr,Signalr,当尝试为某些用户连接时,信号器给我404。URL相同,但access_标记除外 它是稳定的,每个用户都可以复制(我的意思是有些用户是稳定的OK,有些用户是稳定的404) access_令牌解析的jwt diff(左侧为OK用户,右侧为404): 我对日志进行了跟踪级别,并进行了下一步: 对于OK用户: 对于获得404的用户: 注意:黑色方框下的URL是相同的 前端是Angular 9,软件包为“^3.1.8””@microsoft/signal,下面是构建连接的代码: privat

当尝试为某些用户连接时,信号器给我404。URL相同,但access_标记除外

它是稳定的,每个用户都可以复制(我的意思是有些用户是稳定的OK,有些用户是稳定的404)

access_令牌解析的jwt diff(左侧为OK用户,右侧为404):


我对日志进行了跟踪级别,并进行了下一步: 对于OK用户:

对于获得404的用户:

注意:黑色方框下的URL是相同的


前端是Angular 9,软件包为“^3.1.8””@microsoft/signal,下面是构建连接的代码:

  private buildHub(): HubConnection {
    console.log(this.authService.accessToken);
    let builder = new HubConnectionBuilder()
                      .withAutomaticReconnect()
                      .configureLogging(LogLevel.Information)
                      .withUrl('ws/notificationHub', {
                          accessTokenFactory: () => this.authService.accessToken
                        });

    if (this.debugMode) {
      builder = builder.configureLogging(LogLevel.Trace);
    }

    return builder.build();
  }

后端正在使用启动中的下一个代码来配置信号器集线器:

公共void配置服务(IServiceCollection服务)
中:

services.AddSignalR()
.AddJsonProtocol(选项=>
{
options.PayloadSerializerSettings.ContractResolver=新的DefaultContractResolver();
});
公共void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)

公共void配置服务(IServiceCollection服务)
中的此代码:

不幸的是,我无法完全访问可复制的环境,但我可以请求查看任何设置或尝试进行一些更改

我还可以尝试对该问题进行哪些故障排除



更新:协商对两个用户都很好。

最近,在我的JWT增大后,我遇到了这个问题。我发现在我的例子中,由于查询字符串超过了2048的限制,IIS抛出了404错误。在增加查询字符串的最大长度后,我的问题得到了解决

app.UseSignalR(route =>
            {
                route.MapHub<NotificationHub>("/ws/notificationHub");
            });
    [Authorize]
    public class NotificationHub: Hub<INotificationHubClient>
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.Authority = identityServerSettings.Url;
                    options.Audience = identityServerSettings.ApiScopeName;
                    options.RequireHttpsMetadata = identityServerSettings.RequireHttpsMetadata;

                    options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
                    {
                        OnMessageReceived = context =>
                        {
                            var accessToken = context.Request.Query["access_token"];
                            var path = context.HttpContext.Request.Path;
                            if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/ws"))
                            {
                                context.Token = accessToken;
                            }
                            return Task.CompletedTask;
                        }
                    };
                });