我的场景是我有一个API,它实现了信号器和IdentityServer4。我的客户是一个Vuejs SPA,它是一个.net核心应用程序提供的。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());
});
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");
});
客户端总是建立一个成功的连接,并且所有的实时通知都按预期工作。
现在为了测试功能,我启动了两个客户端,一个来自Chrome,一个来自Firefox,而这两个客户端连接在一起,一切正常。
一旦尝试连接第三个客户机(使用chromeinognito或IE-Edge),信号器连接成功,但所有3个客户端的API都挂起。如果我刷新任何一个客户端,其他2个将恢复工作,如果关闭其中一个客户端,其他两个恢复正常工作。
我的问题是什么会导致这个问题,我该如何调查?
这是一个从同一主机启动多个客户机的问题吗?在生产环境中会发生这种情况吗?它会阻止单个主机启动客户机还是所有主机?
编辑
我从本地主机更改为本地IP 192。
.*要尝试从我的移动浏览器连接,看看是否有任何改变,同样的事情发生,在第三个客户端连接API挂起,如果我没有连接到信号器集线器忽略
connection.start()
我目前在本地IIS上托管,而不是IIS express。