对于某些用户(而不是其他用户)使用WebSocket或ServerSentEvents时,SignalR给出404
当尝试为某些用户连接时,信号器给我404。URL相同,但access_标记除外 它是稳定的,每个用户都可以复制(我的意思是有些用户是稳定的OK,有些用户是稳定的404) access_令牌解析的jwt diff(左侧为OK用户,右侧为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
我对日志进行了跟踪级别,并进行了下一步: 对于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;
}
};
});