我的情况是我有一个实现SignalR和IdentityServer4的API。我的客户端是从.net核心应用程序提供的Vuejs SPA。在vue客户端拥有access_token
之后,我将启动信号发送器连接并将其保存在vuex
存储区中。
这是我建立连接的方式:
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端的日志中没有有价值的信息来指示正在发生的事情。
我的问题是什么可能导致此问题,我该如何调查?
这是从同一主机启动多个客户端的问题,并且这会在生产中发生吗,它会阻止单个主机启动客户端还是所有主机?
编辑
我从本地主机更改为本地IP192。。。*,尝试从我的移动浏览器进行连接,看看是否有任何改变,在第3个客户端连接API挂起后,发生了同样的事情,如果我没有通过省略connection.start()
可以连接到signalR集线器,我可以不中断地启动尽可能多的客户端。
此刻我正在本地IIS上托管,而不是IIS Express。