使用SignalR和IdentityServer4的API会挂在3个以上的连接上

时间:2018-09-09 18:42:55

标签: asp.net-core .net-core signalr identityserver4 asp.net-core-signalr

我的情况是我有一个实现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。

0 个答案:

没有答案