Asp.net core 使用标识为Server4的信号器的API挂起在3+;连接

Asp.net core 使用标识为Server4的信号器的API挂起在3+;连接,asp.net-core,.net-core,signalr,identityserver4,asp.net-core-signalr,Asp.net Core,.net Core,Signalr,Identityserver4,Asp.net Core Signalr,我的场景是,我有一个实现SignalR和IdentityServer4的API。我的客户是由.net核心应用程序提供服务的Vuejs SPA。在vue客户端拥有访问\u令牌之后,我启动信号器连接并将其保存在vuex存储中 以下是我设置连接的方式: var connection = new signalR.HubConnectionBuilder() .withUrl(http://example.com + '/notifyHub', { accessTokenFacto

我的场景是,我有一个实现SignalR和IdentityServer4的API。我的客户是由.net核心应用程序提供服务的Vuejs SPA。在vue客户端拥有
访问\u令牌之后,我启动信号器连接并将其保存在
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身份验证的信号器的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>();
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(选项=>
{
options.Authority=$“{u config[“Server”]}”;
options.RequireHttpsMetadata=\u env.IsProduction()?true:false;
options.ApiName=“api”;
options.ApiSecret=“secret”;
options.TokenRetriever=新函数(请求=>
{
var fromHeader=TokenRetrieval.FromAuthorizationHeader();
var fromQuery=TokenRetrieval.FromQueryString();
从表头返回(req)??从查询返回(req);
});
});
services.AddSignalR();
//子声明从令牌中为单个用户使用
services.AddSingleton();
及应用

app.UseWebSockets();

app.UseAuthentication();

app.UseSignalR(routes =>
{
    routes.MapHub<NotificationHub>("/notifyHub");
});
app.UseWebSockets();
app.UseAuthentication();
app.usesigner(路由=>
{
routes.MapHub(“/notifyHub”);
});
客户端总是建立成功的连接,所有实时通知都按预期工作

现在,为了测试功能,我启动了两个客户端,一个来自Chrome,一个来自Firefox,而这两个客户端是连接的,一切正常

一旦尝试连接第三个客户端(使用Chrome Incognito或IE Edge),信号器连接成功,但所有3个客户端的API都挂起。如果我刷新任何一个客户端,其他两个将恢复工作,如果关闭其中一个客户端,其他两个将恢复正常工作

客户端或api端的日志中没有有价值的信息来指示正在发生的事情

我的问题是什么会导致这个问题,以及如何进行调查

这是从同一台主机启动多个客户机的问题吗?这会在生产中发生吗?它会阻止单个主机启动客户机还是阻止所有主机

编辑

我从localhost更改为local IP 192…*尝试从我的移动浏览器连接,看看是否有什么变化,同样的事情发生了,在第三个客户端连接后API挂起,如果我没有通过省略
connection.start()
连接到信号集线器,我可以在不中断的情况下启动尽可能多的客户端


我目前正在本地IIS上托管,而不是IIS express。

请问;我使用的API与您似乎使用的API完全相同。。我有
accessTokenFactory:()=>{return'987654321'}
我在
httpContext.Request
serverside(头或查询字符串)中的任何地方都看不到
9887654321
,在chrome控制台网络中查看请求时也看不到。我看到您有
TokenRetrieval.FromAuthorizationHeader()
TokenRetrieval.FromQueryString()
第一个请求是我正在查看的协商请求。有什么意见吗?将写一个适当的SO问题和链接~这是一个与上述问题相关的问题。你解决了吗?(您可以回答自己的问题):p@Benoit我从来没有这样做过。但是,这个问题在生产中不会出现。