asp.net-core - 使用 SignalR 和 IdentityServer4 的 API 在 3 个以上的连接上挂起
问题描述
我的场景是我有一个实现 SignalR 和 IdentityServer4 的 API。我的客户是一个 .net-core 应用程序提供的 Vuejs SPA。在 vue 客户端启动后,access_token
我启动了信号器连接并将其保存在vuex
store 中。
这就是我设置连接的方式:
var connection = new signalR.HubConnectionBuilder()
.withUrl(http://example.com + '/notifyHub',
{
accessTokenFactory: () => { return token }
}
).build();
connection.start()
.then(() => {
window.console.log("signalR connection successful")
})
.catch(function (err) {
return window.console.error(err.toString());
});
这是我使用 IS4 身份验证的 SignalR 的 API 配置
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = $"{_config["Server"]}";
options.RequireHttpsMetadata = _env.IsProduction() ? true : false;
options.ApiName = "api";
options.ApiSecret = "secret";
options.TokenRetriever = new Func<HttpRequest, string>(req =>
{
var fromHeader = TokenRetrieval.FromAuthorizationHeader();
var fromQuery = TokenRetrieval.FromQueryString();
return fromHeader(req) ?? fromQuery(req);
});
});
services.AddSignalR();
//sub claim is used from the token for individual users
services.AddSingleton<IUserIdProvider, UserProvider>();
及应用
app.UseWebSockets();
app.UseAuthentication();
app.UseSignalR(routes =>
{
routes.MapHub<NotificationHub>("/notifyHub");
});
客户端始终建立成功的连接,并且所有实时通知都按预期工作。
现在为了测试功能,我启动了 2 个客户端,1 个来自 Chrome,1 个来自 Firefox,而这两个客户端已连接,一切正常。
一旦尝试连接第三个客户端(使用 Chrome Incognito 或 IE Edge),信号器连接成功,但所有 3 个客户端的 API 都挂起。如果我刷新任何客户端,其他 2 个将恢复工作,如果关闭其中一个客户端,其他两个将恢复正常工作。
客户端或 api 端的日志中没有有价值的信息来指示正在发生的事情。
我的问题是什么会导致这个问题,我该如何调查?
这是从同一主机启动多个客户端的问题吗?这是否会在生产中发生,它只会阻止单个主机启动客户端或所有主机?
编辑
我从 localhost 更改为本地 IP 192 .. .* 尝试从我的移动浏览器连接,看看是否有任何改变,同样的事情发生了,在第三个客户端连接后,API 挂起,如果我没有通过省略连接到 signalR 集线器,connection.start()
我可以在不中断的情况下启动尽可能多的客户端.
我目前在本地 IIS 上托管,而不是 IIS express。
解决方案
推荐阅读
- java - Spring中两个jms监听器具有相同监听器容器工厂的并发如何处理
- wso2 - wso 2 3.0.0 改变了非管理员用户无法进入管理员门户
- javascript - 如何在 React 中并行维护上传选项的状态?
- sqlite - 将实时数据存储在 sqlite 数据库中以与其他进程共享,但不会保留在磁盘上
- arrays - 索引超出范围 Alamofire Swift 的外部功能
- r - 突出显示前 3 个值
- python - 在python中合并两个数据框时获取空数据框
- reactjs - 用于 Flask 和 React 的 Azure 发布管道
- oracle - 插入触发器 Oracle 之后 - 如何确保仅插入唯一记录?
- asp.net - 为什么 Asp.Net SignalR 使用相同的 ConnectionId 在集线器中多次调用 OnDisconnect?