代码之家  ›  专栏  ›  技术社区  ›  Anton Toshik

使用IdentityServer4的信号器的API挂接在3+个连接上

  •  2
  • Anton Toshik  · 技术社区  · 6 年前

    我的场景是我有一个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。

    0 回复  |  直到 5 年前